Initial release of the Cygwin LSA authentication package.
* ChangeLog: New file. * Makefile.in: Ditto. * aclocal.m4: Ditto. * configure.in: Ditto. * configure: Ditto. Generated from configure.in. * cyglsa-config: Ditto. * cyglsa.c: Ditto. * cyglsa.din: Ditto. * cyglsa64.dll: Ditto. * make-64bit-version-with-visual-c.bat: Ditto. * mslsa.def: Ditto.
This commit is contained in:
parent
c6caaa3429
commit
8e4735df6c
14
winsup/lsaauth/ChangeLog
Normal file
14
winsup/lsaauth/ChangeLog
Normal file
@ -0,0 +1,14 @@
|
||||
2006-11-27 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
Initial release of the Cygwin LSA authentication package.
|
||||
* ChangeLog: New file.
|
||||
* Makefile.in: Ditto.
|
||||
* aclocal.m4: Ditto.
|
||||
* configure.in: Ditto.
|
||||
* configure: Ditto. Generated from configure.in.
|
||||
* cyglsa-config: Ditto.
|
||||
* cyglsa.c: Ditto.
|
||||
* cyglsa.din: Ditto.
|
||||
* cyglsa64.dll: Ditto.
|
||||
* make-64bit-version-with-visual-c.bat: Ditto.
|
||||
* mslsa.def: Ditto.
|
85
winsup/lsaauth/Makefile.in
Normal file
85
winsup/lsaauth/Makefile.in
Normal file
@ -0,0 +1,85 @@
|
||||
# Copyright (c) 2006, Red Hat, 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 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# A copy of the GNU General Public License can be found at
|
||||
# http://www.gnu.org/
|
||||
#
|
||||
# Written by Corinna Vinschen <vinschen@redhat.de>
|
||||
#
|
||||
# Makefile for Cygwin subauthentication DLL.
|
||||
|
||||
SHELL := @SHELL@
|
||||
|
||||
srcdir := @srcdir@
|
||||
VPATH := @srcdir@
|
||||
prefix := @prefix@
|
||||
exec_prefix := @exec_prefix@
|
||||
|
||||
bindir := @bindir@
|
||||
etcdir := $(exec_prefix)/etc
|
||||
|
||||
INSTALL := @INSTALL@
|
||||
INSTALL_PROGRAM := @INSTALL_PROGRAM@
|
||||
INSTALL_DATA := @INSTALL_DATA@
|
||||
|
||||
CC := @CC@
|
||||
CC_FOR_TARGET := $(CC)
|
||||
|
||||
CFLAGS := @CFLAGS@
|
||||
|
||||
include $(srcdir)/../Makefile.common
|
||||
|
||||
WIN32_COMMON := -mno-cygwin
|
||||
WIN32_INCLUDES := -I. -I$(srcdir) $(w32api_include) $(w32api_include)/ddk
|
||||
WIN32_CFLAGS := $(CFLAGS) $(WIN32_COMMON) $(WIN32_INCLUDES)
|
||||
WIN32_LDFLAGS := $(CFLAGS) $(WIN32_COMMON) -nostdlib -Wl,-shared
|
||||
|
||||
LIBS := -ladvapi32 -lkernel32 -lntdll
|
||||
|
||||
DLL := cyglsa.dll
|
||||
DEF_FILE:= cyglsa.def
|
||||
|
||||
OBJ = cyglsa.o
|
||||
|
||||
.SUFFIXES:
|
||||
.NOEXPORT:
|
||||
|
||||
all: Makefile $(DLL)
|
||||
|
||||
$(DEF_FILE): cyglsa.din config.status
|
||||
$(SHELL) config.status
|
||||
|
||||
$(DLL): $(OBJ) $(DEF_FILE)
|
||||
ifdef VERBOSE
|
||||
$(CC) -s $(WIN32_LDFLAGS) -o $@ $(DEF_FILE) $(OBJ) $(LIBS)
|
||||
else
|
||||
@echo $(CC) .. -o $@ $(OBJ)
|
||||
@$(CC) -s $(WIN32_LDFLAGS) -o $@ $(DEF_FILE) $(OBJ) $(LIBS)
|
||||
endif
|
||||
|
||||
.PHONY: all install clean realclean
|
||||
|
||||
realclean: clean
|
||||
rm -f Makefile config.cache
|
||||
|
||||
clean:
|
||||
rm -f *.o *.dll
|
||||
|
||||
install: all
|
||||
$(SHELL) $(updir1)/mkinstalldirs $(bindir)
|
||||
$(INSTALL_PROGRAM) $(DLL) $(bindir)/$(DLL)
|
||||
$(INSTALL_PROGRAM) $(srcdir)/cyglsa64.dll $(bindir)/cyglsa64.dll
|
||||
$(INSTALL_PROGRAM) $(srcdir)/cyglsa-config $(bindir)/cyglsa-config
|
||||
|
||||
%.o: %.c
|
||||
ifdef VERBOSE
|
||||
$(CC) $(WIN32_CFLAGS) -c -o $@ $<
|
||||
else
|
||||
@echo $(CC) -c $(CFLAGS) ... $(<F)
|
||||
@$(CC) $(WIN32_CFLAGS) -c -o $@ $<
|
||||
endif
|
||||
|
875
winsup/lsaauth/aclocal.m4
vendored
Normal file
875
winsup/lsaauth/aclocal.m4
vendored
Normal file
@ -0,0 +1,875 @@
|
||||
dnl aclocal.m4 generated automatically by aclocal 1.4-p6
|
||||
|
||||
dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl This program is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
dnl PARTICULAR PURPOSE.
|
||||
|
||||
# lib-prefix.m4 serial 4 (gettext-0.14.2)
|
||||
dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl From Bruno Haible.
|
||||
|
||||
dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
|
||||
dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
|
||||
dnl require excessive bracketing.
|
||||
ifdef([AC_HELP_STRING],
|
||||
[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
|
||||
[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
|
||||
|
||||
dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
|
||||
dnl to access previously installed libraries. The basic assumption is that
|
||||
dnl a user will want packages to use other packages he previously installed
|
||||
dnl with the same --prefix option.
|
||||
dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
|
||||
dnl libraries, but is otherwise very convenient.
|
||||
AC_DEFUN([AC_LIB_PREFIX],
|
||||
[
|
||||
AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
|
||||
AC_REQUIRE([AC_PROG_CC])
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||
dnl By default, look in $includedir and $libdir.
|
||||
use_additional=yes
|
||||
AC_LIB_WITH_FINAL_PREFIX([
|
||||
eval additional_includedir=\"$includedir\"
|
||||
eval additional_libdir=\"$libdir\"
|
||||
])
|
||||
AC_LIB_ARG_WITH([lib-prefix],
|
||||
[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
|
||||
--without-lib-prefix don't search for libraries in includedir and libdir],
|
||||
[
|
||||
if test "X$withval" = "Xno"; then
|
||||
use_additional=no
|
||||
else
|
||||
if test "X$withval" = "X"; then
|
||||
AC_LIB_WITH_FINAL_PREFIX([
|
||||
eval additional_includedir=\"$includedir\"
|
||||
eval additional_libdir=\"$libdir\"
|
||||
])
|
||||
else
|
||||
additional_includedir="$withval/include"
|
||||
additional_libdir="$withval/lib"
|
||||
fi
|
||||
fi
|
||||
])
|
||||
if test $use_additional = yes; then
|
||||
dnl Potentially add $additional_includedir to $CPPFLAGS.
|
||||
dnl But don't add it
|
||||
dnl 1. if it's the standard /usr/include,
|
||||
dnl 2. if it's already present in $CPPFLAGS,
|
||||
dnl 3. if it's /usr/local/include and we are using GCC on Linux,
|
||||
dnl 4. if it doesn't exist as a directory.
|
||||
if test "X$additional_includedir" != "X/usr/include"; then
|
||||
haveit=
|
||||
for x in $CPPFLAGS; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-I$additional_includedir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test "X$additional_includedir" = "X/usr/local/include"; then
|
||||
if test -n "$GCC"; then
|
||||
case $host_os in
|
||||
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_includedir"; then
|
||||
dnl Really add $additional_includedir to $CPPFLAGS.
|
||||
CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
dnl Potentially add $additional_libdir to $LDFLAGS.
|
||||
dnl But don't add it
|
||||
dnl 1. if it's the standard /usr/lib,
|
||||
dnl 2. if it's already present in $LDFLAGS,
|
||||
dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
|
||||
dnl 4. if it doesn't exist as a directory.
|
||||
if test "X$additional_libdir" != "X/usr/lib"; then
|
||||
haveit=
|
||||
for x in $LDFLAGS; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-L$additional_libdir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test "X$additional_libdir" = "X/usr/local/lib"; then
|
||||
if test -n "$GCC"; then
|
||||
case $host_os in
|
||||
linux*) haveit=yes;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_libdir"; then
|
||||
dnl Really add $additional_libdir to $LDFLAGS.
|
||||
LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
|
||||
dnl acl_final_exec_prefix, containing the values to which $prefix and
|
||||
dnl $exec_prefix will expand at the end of the configure script.
|
||||
AC_DEFUN([AC_LIB_PREPARE_PREFIX],
|
||||
[
|
||||
dnl Unfortunately, prefix and exec_prefix get only finally determined
|
||||
dnl at the end of configure.
|
||||
if test "X$prefix" = "XNONE"; then
|
||||
acl_final_prefix="$ac_default_prefix"
|
||||
else
|
||||
acl_final_prefix="$prefix"
|
||||
fi
|
||||
if test "X$exec_prefix" = "XNONE"; then
|
||||
acl_final_exec_prefix='${prefix}'
|
||||
else
|
||||
acl_final_exec_prefix="$exec_prefix"
|
||||
fi
|
||||
acl_save_prefix="$prefix"
|
||||
prefix="$acl_final_prefix"
|
||||
eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
|
||||
prefix="$acl_save_prefix"
|
||||
])
|
||||
|
||||
dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
|
||||
dnl variables prefix and exec_prefix bound to the values they will have
|
||||
dnl at the end of the configure script.
|
||||
AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
|
||||
[
|
||||
acl_save_prefix="$prefix"
|
||||
prefix="$acl_final_prefix"
|
||||
acl_save_exec_prefix="$exec_prefix"
|
||||
exec_prefix="$acl_final_exec_prefix"
|
||||
$1
|
||||
exec_prefix="$acl_save_exec_prefix"
|
||||
prefix="$acl_save_prefix"
|
||||
])
|
||||
|
||||
# lib-link.m4 serial 6 (gettext-0.14.3)
|
||||
dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl From Bruno Haible.
|
||||
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
|
||||
dnl the libraries corresponding to explicit and implicit dependencies.
|
||||
dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
|
||||
dnl augments the CPPFLAGS variable.
|
||||
AC_DEFUN([AC_LIB_LINKFLAGS],
|
||||
[
|
||||
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||
AC_REQUIRE([AC_LIB_RPATH])
|
||||
define([Name],[translit([$1],[./-], [___])])
|
||||
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||
AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
|
||||
AC_LIB_LINKFLAGS_BODY([$1], [$2])
|
||||
ac_cv_lib[]Name[]_libs="$LIB[]NAME"
|
||||
ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
|
||||
ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
|
||||
])
|
||||
LIB[]NAME="$ac_cv_lib[]Name[]_libs"
|
||||
LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
|
||||
INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
|
||||
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
|
||||
AC_SUBST([LIB]NAME)
|
||||
AC_SUBST([LTLIB]NAME)
|
||||
dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
|
||||
dnl results of this search when this library appears as a dependency.
|
||||
HAVE_LIB[]NAME=yes
|
||||
undefine([Name])
|
||||
undefine([NAME])
|
||||
])
|
||||
|
||||
dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
|
||||
dnl searches for libname and the libraries corresponding to explicit and
|
||||
dnl implicit dependencies, together with the specified include files and
|
||||
dnl the ability to compile and link the specified testcode. If found, it
|
||||
dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
|
||||
dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
|
||||
dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
|
||||
dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
|
||||
AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
|
||||
[
|
||||
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
|
||||
AC_REQUIRE([AC_LIB_RPATH])
|
||||
define([Name],[translit([$1],[./-], [___])])
|
||||
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||
|
||||
dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
|
||||
dnl accordingly.
|
||||
AC_LIB_LINKFLAGS_BODY([$1], [$2])
|
||||
|
||||
dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
|
||||
dnl because if the user has installed lib[]Name and not disabled its use
|
||||
dnl via --without-lib[]Name-prefix, he wants to use it.
|
||||
ac_save_CPPFLAGS="$CPPFLAGS"
|
||||
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
|
||||
|
||||
AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
|
||||
ac_save_LIBS="$LIBS"
|
||||
LIBS="$LIBS $LIB[]NAME"
|
||||
AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
|
||||
LIBS="$ac_save_LIBS"
|
||||
])
|
||||
if test "$ac_cv_lib[]Name" = yes; then
|
||||
HAVE_LIB[]NAME=yes
|
||||
AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
|
||||
AC_MSG_CHECKING([how to link with lib[]$1])
|
||||
AC_MSG_RESULT([$LIB[]NAME])
|
||||
else
|
||||
HAVE_LIB[]NAME=no
|
||||
dnl If $LIB[]NAME didn't lead to a usable library, we don't need
|
||||
dnl $INC[]NAME either.
|
||||
CPPFLAGS="$ac_save_CPPFLAGS"
|
||||
LIB[]NAME=
|
||||
LTLIB[]NAME=
|
||||
fi
|
||||
AC_SUBST([HAVE_LIB]NAME)
|
||||
AC_SUBST([LIB]NAME)
|
||||
AC_SUBST([LTLIB]NAME)
|
||||
undefine([Name])
|
||||
undefine([NAME])
|
||||
])
|
||||
|
||||
dnl Determine the platform dependent parameters needed to use rpath:
|
||||
dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
|
||||
dnl hardcode_direct, hardcode_minus_L.
|
||||
AC_DEFUN([AC_LIB_RPATH],
|
||||
[
|
||||
dnl Tell automake >= 1.10 to complain if config.rpath is missing.
|
||||
m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
|
||||
AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
|
||||
AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
|
||||
AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
|
||||
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
|
||||
AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
|
||||
CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
|
||||
${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
|
||||
. ./conftest.sh
|
||||
rm -f ./conftest.sh
|
||||
acl_cv_rpath=done
|
||||
])
|
||||
wl="$acl_cv_wl"
|
||||
libext="$acl_cv_libext"
|
||||
shlibext="$acl_cv_shlibext"
|
||||
hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
|
||||
hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
|
||||
hardcode_direct="$acl_cv_hardcode_direct"
|
||||
hardcode_minus_L="$acl_cv_hardcode_minus_L"
|
||||
dnl Determine whether the user wants rpath handling at all.
|
||||
AC_ARG_ENABLE(rpath,
|
||||
[ --disable-rpath do not hardcode runtime library paths],
|
||||
:, enable_rpath=yes)
|
||||
])
|
||||
|
||||
dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
|
||||
dnl the libraries corresponding to explicit and implicit dependencies.
|
||||
dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
|
||||
AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
|
||||
[
|
||||
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
|
||||
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
|
||||
dnl By default, look in $includedir and $libdir.
|
||||
use_additional=yes
|
||||
AC_LIB_WITH_FINAL_PREFIX([
|
||||
eval additional_includedir=\"$includedir\"
|
||||
eval additional_libdir=\"$libdir\"
|
||||
])
|
||||
AC_LIB_ARG_WITH([lib$1-prefix],
|
||||
[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
|
||||
--without-lib$1-prefix don't search for lib$1 in includedir and libdir],
|
||||
[
|
||||
if test "X$withval" = "Xno"; then
|
||||
use_additional=no
|
||||
else
|
||||
if test "X$withval" = "X"; then
|
||||
AC_LIB_WITH_FINAL_PREFIX([
|
||||
eval additional_includedir=\"$includedir\"
|
||||
eval additional_libdir=\"$libdir\"
|
||||
])
|
||||
else
|
||||
additional_includedir="$withval/include"
|
||||
additional_libdir="$withval/lib"
|
||||
fi
|
||||
fi
|
||||
])
|
||||
dnl Search the library and its dependencies in $additional_libdir and
|
||||
dnl $LDFLAGS. Using breadth-first-seach.
|
||||
LIB[]NAME=
|
||||
LTLIB[]NAME=
|
||||
INC[]NAME=
|
||||
rpathdirs=
|
||||
ltrpathdirs=
|
||||
names_already_handled=
|
||||
names_next_round='$1 $2'
|
||||
while test -n "$names_next_round"; do
|
||||
names_this_round="$names_next_round"
|
||||
names_next_round=
|
||||
for name in $names_this_round; do
|
||||
already_handled=
|
||||
for n in $names_already_handled; do
|
||||
if test "$n" = "$name"; then
|
||||
already_handled=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$already_handled"; then
|
||||
names_already_handled="$names_already_handled $name"
|
||||
dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
|
||||
dnl or AC_LIB_HAVE_LINKFLAGS call.
|
||||
uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
|
||||
eval value=\"\$HAVE_LIB$uppername\"
|
||||
if test -n "$value"; then
|
||||
if test "$value" = yes; then
|
||||
eval value=\"\$LIB$uppername\"
|
||||
test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
|
||||
eval value=\"\$LTLIB$uppername\"
|
||||
test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
|
||||
else
|
||||
dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
|
||||
dnl that this library doesn't exist. So just drop it.
|
||||
:
|
||||
fi
|
||||
else
|
||||
dnl Search the library lib$name in $additional_libdir and $LDFLAGS
|
||||
dnl and the already constructed $LIBNAME/$LTLIBNAME.
|
||||
found_dir=
|
||||
found_la=
|
||||
found_so=
|
||||
found_a=
|
||||
if test $use_additional = yes; then
|
||||
if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
|
||||
found_dir="$additional_libdir"
|
||||
found_so="$additional_libdir/lib$name.$shlibext"
|
||||
if test -f "$additional_libdir/lib$name.la"; then
|
||||
found_la="$additional_libdir/lib$name.la"
|
||||
fi
|
||||
else
|
||||
if test -f "$additional_libdir/lib$name.$libext"; then
|
||||
found_dir="$additional_libdir"
|
||||
found_a="$additional_libdir/lib$name.$libext"
|
||||
if test -f "$additional_libdir/lib$name.la"; then
|
||||
found_la="$additional_libdir/lib$name.la"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if test "X$found_dir" = "X"; then
|
||||
for x in $LDFLAGS $LTLIB[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
case "$x" in
|
||||
-L*)
|
||||
dir=`echo "X$x" | sed -e 's/^X-L//'`
|
||||
if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
|
||||
found_dir="$dir"
|
||||
found_so="$dir/lib$name.$shlibext"
|
||||
if test -f "$dir/lib$name.la"; then
|
||||
found_la="$dir/lib$name.la"
|
||||
fi
|
||||
else
|
||||
if test -f "$dir/lib$name.$libext"; then
|
||||
found_dir="$dir"
|
||||
found_a="$dir/lib$name.$libext"
|
||||
if test -f "$dir/lib$name.la"; then
|
||||
found_la="$dir/lib$name.la"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
if test "X$found_dir" != "X"; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if test "X$found_dir" != "X"; then
|
||||
dnl Found the library.
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
|
||||
if test "X$found_so" != "X"; then
|
||||
dnl Linking with a shared library. We attempt to hardcode its
|
||||
dnl directory into the executable's runpath, unless it's the
|
||||
dnl standard /usr/lib.
|
||||
if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
|
||||
dnl No hardcoding is needed.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||
else
|
||||
dnl Use an explicit option to hardcode DIR into the resulting
|
||||
dnl binary.
|
||||
dnl Potentially add DIR to ltrpathdirs.
|
||||
dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
|
||||
haveit=
|
||||
for x in $ltrpathdirs; do
|
||||
if test "X$x" = "X$found_dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
ltrpathdirs="$ltrpathdirs $found_dir"
|
||||
fi
|
||||
dnl The hardcoding into $LIBNAME is system dependent.
|
||||
if test "$hardcode_direct" = yes; then
|
||||
dnl Using DIR/libNAME.so during linking hardcodes DIR into the
|
||||
dnl resulting binary.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||
else
|
||||
if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
|
||||
dnl Use an explicit option to hardcode DIR into the resulting
|
||||
dnl binary.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||
dnl Potentially add DIR to rpathdirs.
|
||||
dnl The rpathdirs will be appended to $LIBNAME at the end.
|
||||
haveit=
|
||||
for x in $rpathdirs; do
|
||||
if test "X$x" = "X$found_dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
rpathdirs="$rpathdirs $found_dir"
|
||||
fi
|
||||
else
|
||||
dnl Rely on "-L$found_dir".
|
||||
dnl But don't add it if it's already contained in the LDFLAGS
|
||||
dnl or the already constructed $LIBNAME
|
||||
haveit=
|
||||
for x in $LDFLAGS $LIB[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-L$found_dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
|
||||
fi
|
||||
if test "$hardcode_minus_L" != no; then
|
||||
dnl FIXME: Not sure whether we should use
|
||||
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
|
||||
dnl here.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
|
||||
else
|
||||
dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
|
||||
dnl here, because this doesn't fit in flags passed to the
|
||||
dnl compiler. So give up. No hardcoding. This affects only
|
||||
dnl very old systems.
|
||||
dnl FIXME: Not sure whether we should use
|
||||
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
|
||||
dnl here.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if test "X$found_a" != "X"; then
|
||||
dnl Linking with a static library.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
|
||||
else
|
||||
dnl We shouldn't come here, but anyway it's good to have a
|
||||
dnl fallback.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
|
||||
fi
|
||||
fi
|
||||
dnl Assume the include files are nearby.
|
||||
additional_includedir=
|
||||
case "$found_dir" in
|
||||
*/lib | */lib/)
|
||||
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
|
||||
additional_includedir="$basedir/include"
|
||||
;;
|
||||
esac
|
||||
if test "X$additional_includedir" != "X"; then
|
||||
dnl Potentially add $additional_includedir to $INCNAME.
|
||||
dnl But don't add it
|
||||
dnl 1. if it's the standard /usr/include,
|
||||
dnl 2. if it's /usr/local/include and we are using GCC on Linux,
|
||||
dnl 3. if it's already present in $CPPFLAGS or the already
|
||||
dnl constructed $INCNAME,
|
||||
dnl 4. if it doesn't exist as a directory.
|
||||
if test "X$additional_includedir" != "X/usr/include"; then
|
||||
haveit=
|
||||
if test "X$additional_includedir" = "X/usr/local/include"; then
|
||||
if test -n "$GCC"; then
|
||||
case $host_os in
|
||||
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if test -z "$haveit"; then
|
||||
for x in $CPPFLAGS $INC[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-I$additional_includedir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_includedir"; then
|
||||
dnl Really add $additional_includedir to $INCNAME.
|
||||
INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
dnl Look for dependencies.
|
||||
if test -n "$found_la"; then
|
||||
dnl Read the .la file. It defines the variables
|
||||
dnl dlname, library_names, old_library, dependency_libs, current,
|
||||
dnl age, revision, installed, dlopen, dlpreopen, libdir.
|
||||
save_libdir="$libdir"
|
||||
case "$found_la" in
|
||||
*/* | *\\*) . "$found_la" ;;
|
||||
*) . "./$found_la" ;;
|
||||
esac
|
||||
libdir="$save_libdir"
|
||||
dnl We use only dependency_libs.
|
||||
for dep in $dependency_libs; do
|
||||
case "$dep" in
|
||||
-L*)
|
||||
additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
|
||||
dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
|
||||
dnl But don't add it
|
||||
dnl 1. if it's the standard /usr/lib,
|
||||
dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
|
||||
dnl 3. if it's already present in $LDFLAGS or the already
|
||||
dnl constructed $LIBNAME,
|
||||
dnl 4. if it doesn't exist as a directory.
|
||||
if test "X$additional_libdir" != "X/usr/lib"; then
|
||||
haveit=
|
||||
if test "X$additional_libdir" = "X/usr/local/lib"; then
|
||||
if test -n "$GCC"; then
|
||||
case $host_os in
|
||||
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
if test -z "$haveit"; then
|
||||
haveit=
|
||||
for x in $LDFLAGS $LIB[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-L$additional_libdir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_libdir"; then
|
||||
dnl Really add $additional_libdir to $LIBNAME.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
|
||||
fi
|
||||
fi
|
||||
haveit=
|
||||
for x in $LDFLAGS $LTLIB[]NAME; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X-L$additional_libdir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
if test -d "$additional_libdir"; then
|
||||
dnl Really add $additional_libdir to $LTLIBNAME.
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
-R*)
|
||||
dir=`echo "X$dep" | sed -e 's/^X-R//'`
|
||||
if test "$enable_rpath" != no; then
|
||||
dnl Potentially add DIR to rpathdirs.
|
||||
dnl The rpathdirs will be appended to $LIBNAME at the end.
|
||||
haveit=
|
||||
for x in $rpathdirs; do
|
||||
if test "X$x" = "X$dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
rpathdirs="$rpathdirs $dir"
|
||||
fi
|
||||
dnl Potentially add DIR to ltrpathdirs.
|
||||
dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
|
||||
haveit=
|
||||
for x in $ltrpathdirs; do
|
||||
if test "X$x" = "X$dir"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
ltrpathdirs="$ltrpathdirs $dir"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
-l*)
|
||||
dnl Handle this in the next round.
|
||||
names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
|
||||
;;
|
||||
*.la)
|
||||
dnl Handle this in the next round. Throw away the .la's
|
||||
dnl directory; it is already contained in a preceding -L
|
||||
dnl option.
|
||||
names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
|
||||
;;
|
||||
*)
|
||||
dnl Most likely an immediate library name.
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
else
|
||||
dnl Didn't find the library; assume it is in the system directories
|
||||
dnl known to the linker and runtime loader. (All the system
|
||||
dnl directories known to the linker should also be known to the
|
||||
dnl runtime loader, otherwise the system is severely misconfigured.)
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
done
|
||||
if test "X$rpathdirs" != "X"; then
|
||||
if test -n "$hardcode_libdir_separator"; then
|
||||
dnl Weird platform: only the last -rpath option counts, the user must
|
||||
dnl pass all path elements in one option. We can arrange that for a
|
||||
dnl single library, but not when more than one $LIBNAMEs are used.
|
||||
alldirs=
|
||||
for found_dir in $rpathdirs; do
|
||||
alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
|
||||
done
|
||||
dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
|
||||
acl_save_libdir="$libdir"
|
||||
libdir="$alldirs"
|
||||
eval flag=\"$hardcode_libdir_flag_spec\"
|
||||
libdir="$acl_save_libdir"
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
|
||||
else
|
||||
dnl The -rpath options are cumulative.
|
||||
for found_dir in $rpathdirs; do
|
||||
acl_save_libdir="$libdir"
|
||||
libdir="$found_dir"
|
||||
eval flag=\"$hardcode_libdir_flag_spec\"
|
||||
libdir="$acl_save_libdir"
|
||||
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
|
||||
done
|
||||
fi
|
||||
fi
|
||||
if test "X$ltrpathdirs" != "X"; then
|
||||
dnl When using libtool, the option that works for both libraries and
|
||||
dnl executables is -R. The -R options are cumulative.
|
||||
for found_dir in $ltrpathdirs; do
|
||||
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
|
||||
done
|
||||
fi
|
||||
])
|
||||
|
||||
dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
|
||||
dnl unless already present in VAR.
|
||||
dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
|
||||
dnl contains two or three consecutive elements that belong together.
|
||||
AC_DEFUN([AC_LIB_APPENDTOVAR],
|
||||
[
|
||||
for element in [$2]; do
|
||||
haveit=
|
||||
for x in $[$1]; do
|
||||
AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
|
||||
if test "X$x" = "X$element"; then
|
||||
haveit=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test -z "$haveit"; then
|
||||
[$1]="${[$1]}${[$1]:+ }$element"
|
||||
fi
|
||||
done
|
||||
])
|
||||
|
||||
# lib-ld.m4 serial 3 (gettext-0.13)
|
||||
dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl Subroutines of libtool.m4,
|
||||
dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
|
||||
dnl with libtool.m4.
|
||||
|
||||
dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
|
||||
AC_DEFUN([AC_LIB_PROG_LD_GNU],
|
||||
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
|
||||
[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
|
||||
case `$LD -v 2>&1 </dev/null` in
|
||||
*GNU* | *'with BFD'*)
|
||||
acl_cv_prog_gnu_ld=yes ;;
|
||||
*)
|
||||
acl_cv_prog_gnu_ld=no ;;
|
||||
esac])
|
||||
with_gnu_ld=$acl_cv_prog_gnu_ld
|
||||
])
|
||||
|
||||
dnl From libtool-1.4. Sets the variable LD.
|
||||
AC_DEFUN([AC_LIB_PROG_LD],
|
||||
[AC_ARG_WITH(gnu-ld,
|
||||
[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
|
||||
test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
|
||||
AC_REQUIRE([AC_PROG_CC])dnl
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||
# Prepare PATH_SEPARATOR.
|
||||
# The user is always right.
|
||||
if test "${PATH_SEPARATOR+set}" != set; then
|
||||
echo "#! /bin/sh" >conf$$.sh
|
||||
echo "exit 0" >>conf$$.sh
|
||||
chmod +x conf$$.sh
|
||||
if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
|
||||
PATH_SEPARATOR=';'
|
||||
else
|
||||
PATH_SEPARATOR=:
|
||||
fi
|
||||
rm -f conf$$.sh
|
||||
fi
|
||||
ac_prog=ld
|
||||
if test "$GCC" = yes; then
|
||||
# Check if gcc -print-prog-name=ld gives a path.
|
||||
AC_MSG_CHECKING([for ld used by GCC])
|
||||
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.
|
||||
[[\\/]* | [A-Za-z]:[\\/]*)]
|
||||
[re_direlt='/[^/][^/]*/\.\./']
|
||||
# Canonicalize the path of ld
|
||||
ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
|
||||
while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
|
||||
ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
|
||||
done
|
||||
test -z "$LD" && LD="$ac_prog"
|
||||
;;
|
||||
"")
|
||||
# If it fails, then pretend we aren't using GCC.
|
||||
ac_prog=ld
|
||||
;;
|
||||
*)
|
||||
# If it is relative, then search for the first ld in PATH.
|
||||
with_gnu_ld=unknown
|
||||
;;
|
||||
esac
|
||||
elif test "$with_gnu_ld" = yes; then
|
||||
AC_MSG_CHECKING([for GNU ld])
|
||||
else
|
||||
AC_MSG_CHECKING([for non-GNU ld])
|
||||
fi
|
||||
AC_CACHE_VAL(acl_cv_path_LD,
|
||||
[if test -z "$LD"; then
|
||||
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
|
||||
for ac_dir in $PATH; do
|
||||
test -z "$ac_dir" && ac_dir=.
|
||||
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
|
||||
acl_cv_path_LD="$ac_dir/$ac_prog"
|
||||
# Check to see if the program is GNU ld. I'd rather use --version,
|
||||
# but apparently some GNU ld's only accept -v.
|
||||
# Break only if it was the GNU/non-GNU ld that we prefer.
|
||||
case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
|
||||
*GNU* | *'with BFD'*)
|
||||
test "$with_gnu_ld" != no && break ;;
|
||||
*)
|
||||
test "$with_gnu_ld" != yes && break ;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
IFS="$ac_save_ifs"
|
||||
else
|
||||
acl_cv_path_LD="$LD" # Let the user override the test with a path.
|
||||
fi])
|
||||
LD="$acl_cv_path_LD"
|
||||
if test -n "$LD"; then
|
||||
AC_MSG_RESULT($LD)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
|
||||
AC_LIB_PROG_LD_GNU
|
||||
])
|
||||
|
||||
dnl This provides configure definitions used by all the winsup
|
||||
dnl configure.in files.
|
||||
|
||||
# FIXME: We temporarily define our own version of AC_PROG_CC. This is
|
||||
# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
|
||||
# are probably using a cross compiler, which will not be able to fully
|
||||
# link an executable. This should really be fixed in autoconf
|
||||
# itself.
|
||||
|
||||
AC_DEFUN([LIB_AC_PROG_CC_GNU],
|
||||
[AC_CACHE_CHECK(whether we are using GNU C, ac_cv_prog_gcc,
|
||||
[dnl The semicolon is to pacify NeXT's syntax-checking cpp.
|
||||
cat > conftest.c <<EOF
|
||||
#ifdef __GNUC__
|
||||
yes;
|
||||
#endif
|
||||
EOF
|
||||
if AC_TRY_COMMAND(${CC-cc} -E conftest.c) | egrep yes >/dev/null 2>&1; then
|
||||
ac_cv_prog_gcc=yes
|
||||
else
|
||||
ac_cv_prog_gcc=no
|
||||
fi])])
|
||||
|
||||
AC_DEFUN([LIB_AC_PROG_CC],
|
||||
[AC_BEFORE([$0], [AC_PROG_CPP])dnl
|
||||
AC_CHECK_TOOL(CC, gcc, gcc)
|
||||
: ${CC:=gcc}
|
||||
AC_PROG_CC
|
||||
test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
|
||||
])
|
||||
|
||||
AC_DEFUN([LIB_AC_PROG_CXX],
|
||||
[AC_BEFORE([$0], [AC_PROG_CPP])dnl
|
||||
AC_CHECK_TOOL(CXX, g++, g++)
|
||||
if test -z "$CXX"; then
|
||||
AC_CHECK_TOOL(CXX, g++, c++, , , )
|
||||
: ${CXX:=g++}
|
||||
AC_PROG_CXX
|
||||
test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
|
||||
fi
|
||||
|
||||
CXXFLAGS='$(CFLAGS)'
|
||||
])
|
||||
|
3414
winsup/lsaauth/configure
vendored
Executable file
3414
winsup/lsaauth/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
42
winsup/lsaauth/configure.in
Normal file
42
winsup/lsaauth/configure.in
Normal file
@ -0,0 +1,42 @@
|
||||
dnl Copyright (c) 2006, Red Hat, Inc.
|
||||
dnl
|
||||
dnl This program is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 2 of the License, or
|
||||
dnl (at your option) any later version.
|
||||
dnl
|
||||
dnl A copy of the GNU General Public License can be found at
|
||||
dnl http://www.gnu.org/
|
||||
dnl
|
||||
dnl Written by Christopher Faylor <cgf@redhat.com>
|
||||
dnl Changed for lsa subdir by Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
dnl Autoconf configure script for Cygwin utilities.
|
||||
dnl
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.59)
|
||||
AC_INIT(Makefile.in)
|
||||
|
||||
AC_CONFIG_AUX_DIR(../..)
|
||||
|
||||
AC_CANONICAL_SYSTEM
|
||||
|
||||
LIB_AC_PROG_CC
|
||||
|
||||
AC_ARG_PROGRAM
|
||||
|
||||
if test "x$cross_compiling" = "xyes"; then
|
||||
if test "x$program_transform_name" = "xs,x,x,"; then
|
||||
program_transform_name=""
|
||||
fi
|
||||
if test "x$program_transform_name" = "x"; then
|
||||
program_transform_name="s,^,$host-,"
|
||||
else
|
||||
program_transform_name="$program_transform_name -e s,^,$host-,"
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_PROG_INSTALL
|
||||
|
||||
AC_OUTPUT(Makefile cyglsa.def:cyglsa.din)
|
115
winsup/lsaauth/cyglsa-config
Executable file
115
winsup/lsaauth/cyglsa-config
Executable file
@ -0,0 +1,115 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# cyglsa-config, Copyright 2006 Red Hat 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 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# A copy of the GNU General Public License can be found at
|
||||
# http://www.gnu.org/
|
||||
#
|
||||
# This file is part of the Cygwin LSA authentication package.
|
||||
|
||||
request()
|
||||
{
|
||||
if [ "${auto_answer}" = "yes" ]
|
||||
then
|
||||
echo "$1 (yes/no) yes"
|
||||
return 0
|
||||
elif [ "${auto_answer}" = "no" ]
|
||||
then
|
||||
echo "$1 (yes/no) no"
|
||||
return 1
|
||||
fi
|
||||
|
||||
answer=""
|
||||
while [ "X${answer}" != "Xyes" -a "X${answer}" != "Xno" ]
|
||||
do
|
||||
echo -n "$1 (yes/no) "
|
||||
read -e answer
|
||||
done
|
||||
if [ "X${answer}" = "Xyes" ]
|
||||
then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Check if running on NT
|
||||
_sys="`uname`"
|
||||
_nt=`expr "${_sys}" : "CYGWIN_NT"`
|
||||
if [ ${_nt} -eq 0 ]
|
||||
then
|
||||
echo "LSA authentication does not work on Windows 95/98/Me. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
# If running on NT, check if running under at least Windows 2000
|
||||
_nt_too_old=`uname | awk -F- '{print ( $2 < 5.0 ) ? 1 : 0;}'`
|
||||
if [ ${_nt_too_old} -eq 1 ]
|
||||
then
|
||||
echo "Cygwin LSA authentication not supported on Windows NT4 or older. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Directory in which cyglsa DLL is installed as DOS path.
|
||||
bindir=`cygpath -w /`\\bin
|
||||
|
||||
# Check if we're running on 64 bit Windows. If so, we need the 64 bit
|
||||
# cyglsa DLL.
|
||||
dll=cyglsa.dll
|
||||
test -d `cygpath -p ${SYSTEMROOT}`/SysWOW64 && dll=cyglsa64.dll
|
||||
|
||||
# Check if the DLL is actually installed. If not, bail out.
|
||||
if [ ! -f /bin/${dll} ]
|
||||
then
|
||||
echo "Required Cygwin authentication DLL /bin/${dll} doesn't exist. Exiting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Warning: Registering the Cygwin LSA authentication package requires"
|
||||
echo "administrator privileges! You also have to reboot the machine to"
|
||||
echo "activate the change."
|
||||
echo
|
||||
request "Are you sure you want to continue?" || exit 0
|
||||
|
||||
# The registry value which keeps the authentication packages.
|
||||
value='/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Lsa/Authentication Packages'
|
||||
|
||||
# Get old content, remove evry trace of "cyglsa" from it and write the
|
||||
# content back to the registry with the new, correct path to the cyglsa DLL.
|
||||
old=`regtool get "${value}"`
|
||||
new=`for i in ${old}
|
||||
do
|
||||
echo $i | grep -v cyglsa
|
||||
done`
|
||||
if ! regtool set "${value}" ${new} "${bindir}\\${dll}"
|
||||
then
|
||||
echo "Setting the new registry value failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Cygwin LSA authentication package registered."
|
||||
echo
|
||||
echo "Activating the Cygwin's LSA authentication package requires to reboot."
|
||||
if [ -x /bin/shutdown ]
|
||||
then
|
||||
if request "Do you want to do this immediately?"
|
||||
then
|
||||
echo
|
||||
echo "Other users might still be working on this machine."
|
||||
echo
|
||||
if request "Are you sure?"
|
||||
then
|
||||
echo
|
||||
echo "Ok, will reboot in 30 seconds."
|
||||
echo
|
||||
echo "If you change your mind, call 'shutdown -a' within 30 seconds"
|
||||
shutdown -r 30
|
||||
fi
|
||||
fi
|
||||
fi
|
508
winsup/lsaauth/cyglsa.c
Normal file
508
winsup/lsaauth/cyglsa.c
Normal file
@ -0,0 +1,508 @@
|
||||
/* cyglsa.c: LSA authentication module for Cygwin
|
||||
|
||||
Copyright 2006 Red Hat, Inc.
|
||||
|
||||
Written by Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
This software is a copyrighted work licensed under the terms of the
|
||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */
|
||||
|
||||
#define WINVER 0x0600
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
#include <ntstatus.h>
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#include <wininet.h>
|
||||
#include <lm.h>
|
||||
#include <ntsecapi.h>
|
||||
#include "../cygwin/cyglsa.h"
|
||||
#include "../cygwin/include/cygwin/version.h"
|
||||
|
||||
static PLSA_SECPKG_FUNCS funcs;
|
||||
static BOOL must_create_logon_sid;
|
||||
|
||||
BOOL APIENTRY
|
||||
DllMain (HINSTANCE inst, DWORD reason, LPVOID res)
|
||||
{
|
||||
switch (reason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
case DLL_THREAD_ATTACH:
|
||||
case DLL_THREAD_DETACH:
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static PUNICODE_STRING
|
||||
uni_alloc (PWCHAR src, DWORD len)
|
||||
{
|
||||
PUNICODE_STRING tgt;
|
||||
|
||||
if (!(tgt = funcs->AllocateLsaHeap (sizeof (UNICODE_STRING))))
|
||||
return NULL;
|
||||
tgt->Length = len * sizeof (WCHAR);
|
||||
tgt->MaximumLength = tgt->Length + sizeof (WCHAR);
|
||||
if (!(tgt->Buffer = funcs->AllocateLsaHeap (tgt->MaximumLength)))
|
||||
{
|
||||
funcs->FreeLsaHeap (tgt);
|
||||
return NULL;
|
||||
}
|
||||
wcscpy (tgt->Buffer, src);
|
||||
return tgt;
|
||||
}
|
||||
|
||||
#ifdef DEBUGGING
|
||||
/* No, I don't want to include stdio.h... */
|
||||
extern int sprintf (const char *, const char *, ...);
|
||||
|
||||
static void
|
||||
print (HANDLE fh, const char *text, BOOL nl)
|
||||
{
|
||||
DWORD wr;
|
||||
|
||||
WriteFile (fh, text, strlen (text), &wr, NULL);
|
||||
if (nl)
|
||||
WriteFile (fh, "\n", 1, &wr, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
print_sid (HANDLE fh, const char *prefix, int idx, PISID sid)
|
||||
{
|
||||
char buf[256];
|
||||
DWORD i;
|
||||
|
||||
print (fh, prefix, FALSE);
|
||||
if (idx >= 0)
|
||||
{
|
||||
sprintf (buf, "[%d] ", idx);
|
||||
print (fh, buf, FALSE);
|
||||
}
|
||||
sprintf (buf, "(0x%08x) ", (INT_PTR) sid);
|
||||
print (fh, buf, FALSE);
|
||||
if (!sid)
|
||||
print (fh, "NULL", TRUE);
|
||||
else if (IsBadReadPtr (sid, 8))
|
||||
print (fh, "INVALID POINTER", TRUE);
|
||||
else if (!IsValidSid ((PSID) sid))
|
||||
print (fh, "INVALID SID", TRUE);
|
||||
else if (IsBadReadPtr (sid, 8 + sizeof (DWORD) * sid->SubAuthorityCount))
|
||||
print (fh, "INVALID POINTER SPACE", TRUE);
|
||||
else
|
||||
{
|
||||
sprintf (buf, "S-%d-%d", sid->Revision, sid->IdentifierAuthority.Value[5]);
|
||||
for (i = 0; i < sid->SubAuthorityCount; ++i)
|
||||
sprintf (buf + strlen (buf), "-%lu", sid->SubAuthority[i]);
|
||||
print (fh, buf, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_groups (HANDLE fh, PTOKEN_GROUPS grps)
|
||||
{
|
||||
char buf[256];
|
||||
DWORD i;
|
||||
|
||||
sprintf (buf, "Groups: (0x%08x) ", (INT_PTR) grps);
|
||||
print (fh, buf, FALSE);
|
||||
if (!grps)
|
||||
print (fh, "NULL", TRUE);
|
||||
else if (IsBadReadPtr (grps, sizeof (DWORD)))
|
||||
print (fh, "INVALID POINTER", TRUE);
|
||||
else if (IsBadReadPtr (grps, sizeof (DWORD) + sizeof (SID_AND_ATTRIBUTES)
|
||||
* grps->GroupCount))
|
||||
print (fh, "INVALID POINTER SPACE", TRUE);
|
||||
else
|
||||
{
|
||||
sprintf (buf, "Count: %lu", grps->GroupCount);
|
||||
print (fh, buf, TRUE);
|
||||
for (i = 0; i < grps->GroupCount; ++i)
|
||||
{
|
||||
sprintf (buf, "(attr: 0x%lx)", grps->Groups[i].Attributes);
|
||||
print_sid (fh, " ", i, (PISID) grps->Groups[i].Sid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_privs (HANDLE fh, PTOKEN_PRIVILEGES privs)
|
||||
{
|
||||
char buf[256];
|
||||
DWORD i;
|
||||
|
||||
sprintf (buf, "Privileges: (0x%08x) ", (INT_PTR) privs);
|
||||
print (fh, buf, FALSE);
|
||||
if (!privs)
|
||||
print (fh, "NULL", TRUE);
|
||||
else if (IsBadReadPtr (privs, sizeof (DWORD)))
|
||||
print (fh, "INVALID POINTER", TRUE);
|
||||
else if (IsBadReadPtr (privs, sizeof (DWORD) + sizeof (LUID_AND_ATTRIBUTES)
|
||||
* privs->PrivilegeCount))
|
||||
print (fh, "INVALID POINTER SPACE", TRUE);
|
||||
else
|
||||
{
|
||||
sprintf (buf, "Count: %lu", privs->PrivilegeCount);
|
||||
print (fh, buf, TRUE);
|
||||
for (i = 0; i < privs->PrivilegeCount; ++i)
|
||||
{
|
||||
sprintf (buf, "Luid: {%ld, %lu} Attributes: 0x%lx",
|
||||
privs->Privileges[i].Luid.HighPart,
|
||||
privs->Privileges[i].Luid.LowPart,
|
||||
privs->Privileges[i].Attributes);
|
||||
print (fh, buf, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_dacl (HANDLE fh, PACL dacl)
|
||||
{
|
||||
char buf[256];
|
||||
DWORD i;
|
||||
|
||||
sprintf (buf, "DefaultDacl: (0x%08x) ", (INT_PTR) dacl);
|
||||
print (fh, buf, FALSE);
|
||||
if (!dacl)
|
||||
print (fh, "NULL", TRUE);
|
||||
else if (IsBadReadPtr (dacl, sizeof (ACL)))
|
||||
print (fh, "INVALID POINTER", TRUE);
|
||||
else if (IsBadReadPtr (dacl, dacl->AclSize))
|
||||
print (fh, "INVALID POINTER SPACE", TRUE);
|
||||
else
|
||||
{
|
||||
sprintf (buf, "Rev: %d, Count: %d", dacl->AclRevision, dacl->AceCount);
|
||||
print (fh, buf, TRUE);
|
||||
for (i = 0; i < dacl->AceCount; ++i)
|
||||
{
|
||||
PACCESS_ALLOWED_ACE ace;
|
||||
|
||||
if (!GetAce (dacl, i, (PVOID *) &ace))
|
||||
{
|
||||
sprintf (buf, "[%lu] GetAce error %lu", i, GetLastError ());
|
||||
print (fh, buf, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (buf, "Type: %x, Flags: %x, Access: %lx, ",
|
||||
ace->Header.AceType, ace->Header.AceFlags, (DWORD) ace->Mask);
|
||||
print_sid (fh, buf, i, (PISID) &ace->SidStart);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_tokinf (PLSA_TOKEN_INFORMATION_V2 ptok, size_t size,
|
||||
PVOID got_start, PVOID gotinf_start, PVOID gotinf_end)
|
||||
{
|
||||
HANDLE fh;
|
||||
char buf[256];
|
||||
|
||||
fh = CreateFile ("C:\\cyglsa.dbgout", GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (fh == INVALID_HANDLE_VALUE)
|
||||
return;
|
||||
|
||||
sprintf (buf, "INCOMING: start: 0x%08x infstart: 0x%08x infend: 0x%08x",
|
||||
(INT_PTR) got_start, (INT_PTR) gotinf_start,
|
||||
(INT_PTR) gotinf_end);
|
||||
print (fh, buf, TRUE);
|
||||
|
||||
sprintf (buf, "LSA_TOKEN_INFORMATION_V2: 0x%08x - 0x%08x",
|
||||
(INT_PTR) ptok, (INT_PTR) ptok + size);
|
||||
print (fh, buf, TRUE);
|
||||
|
||||
/* User SID */
|
||||
sprintf (buf, "User: (attr: 0x%lx)", ptok->User.User.Attributes);
|
||||
print_sid (fh, "User: ", -1, (PISID) ptok->User.User.Sid);
|
||||
|
||||
/* Groups */
|
||||
print_groups (fh, ptok->Groups);
|
||||
|
||||
/* Primary Group SID */
|
||||
print_sid (fh, "Primary Group: ", -1, (PISID)ptok->PrimaryGroup.PrimaryGroup);
|
||||
|
||||
/* Privileges */
|
||||
print_privs (fh, ptok->Privileges);
|
||||
|
||||
/* Owner */
|
||||
print_sid (fh, "Owner: ", -1, (PISID) ptok->Owner.Owner);
|
||||
|
||||
/* Default DACL */
|
||||
print_dacl (fh, ptok->DefaultDacl.DefaultDacl);
|
||||
|
||||
CloseHandle (fh);
|
||||
}
|
||||
#endif /* DEBUGGING */
|
||||
|
||||
NTSTATUS NTAPI
|
||||
LsaApInitializePackage (ULONG authp_id, PLSA_SECPKG_FUNCS dpt,
|
||||
PLSA_STRING dummy1, PLSA_STRING dummy2,
|
||||
PLSA_STRING *authp_name)
|
||||
{
|
||||
PLSA_STRING name = NULL;
|
||||
DWORD vers, major, minor;
|
||||
|
||||
/* Set global pointer to lsa helper function table. */
|
||||
funcs = dpt;
|
||||
|
||||
/* Allocate and set the name of the authentication package. This is the
|
||||
name which has to be used in LsaLookupAuthenticationPackage. */
|
||||
if (!(name = funcs->AllocateLsaHeap (sizeof *name)))
|
||||
return STATUS_NO_MEMORY;
|
||||
if (!(name->Buffer = funcs->AllocateLsaHeap (sizeof (CYG_LSA_PKGNAME))))
|
||||
{
|
||||
funcs->FreeLsaHeap (name);
|
||||
return STATUS_NO_MEMORY;
|
||||
}
|
||||
name->Length = sizeof (CYG_LSA_PKGNAME) - 1;
|
||||
name->MaximumLength = sizeof (CYG_LSA_PKGNAME);
|
||||
strcpy (name->Buffer, CYG_LSA_PKGNAME);
|
||||
(*authp_name) = name;
|
||||
|
||||
vers = GetVersion ();
|
||||
major = LOBYTE (LOWORD (vers));
|
||||
minor = HIBYTE (LOWORD (vers));
|
||||
/* Check if we're running on Windows 2000 or lower. If so, we must create
|
||||
the logon sid in the group list by ourselves. */
|
||||
if (major < 5 || (major == 5 && minor == 0))
|
||||
must_create_logon_sid = TRUE;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS NTAPI
|
||||
LsaApLogonUser (PLSA_CLIENT_REQUEST request, SECURITY_LOGON_TYPE logon_type,
|
||||
PVOID auth, PVOID client_auth_base, ULONG auth_len,
|
||||
PVOID *pbuf, PULONG pbuf_len, PLUID logon_id,
|
||||
PNTSTATUS sub_stat, PLSA_TOKEN_INFORMATION_TYPE tok_type,
|
||||
PVOID *tok, PLSA_UNICODE_STRING *account,
|
||||
PLSA_UNICODE_STRING *authority)
|
||||
{
|
||||
WCHAR user[UNLEN + 1];
|
||||
WCHAR domain[INTERNET_MAX_HOST_NAME_LENGTH + 1];
|
||||
DWORD checksum, ulen, dlen, i;
|
||||
PDWORD csp, csp_end;
|
||||
NTSTATUS stat;
|
||||
SECPKG_CLIENT_INFO clinf;
|
||||
PLSA_TOKEN_INFORMATION_V2 tokinf;
|
||||
|
||||
cyglsa_t *authinf = (cyglsa_t *) auth;
|
||||
|
||||
/* Check if the caller has the SeTcbPrivilege, otherwise refuse service. */
|
||||
stat = funcs->GetClientInfo (&clinf);
|
||||
if (stat != STATUS_SUCCESS)
|
||||
return stat;
|
||||
if (!clinf.HasTcbPrivilege)
|
||||
return STATUS_ACCESS_DENIED;
|
||||
|
||||
/* Make a couple of validity checks. */
|
||||
if (auth_len < sizeof *authinf
|
||||
|| authinf->magic != CYG_LSA_MAGIC
|
||||
|| !authinf->username[0]
|
||||
|| !authinf->domain[0])
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
checksum = CYGWIN_VERSION_MAGIC (CYGWIN_VERSION_DLL_MAJOR,
|
||||
CYGWIN_VERSION_DLL_MINOR);
|
||||
csp = (PDWORD) &authinf->username;
|
||||
csp_end = (PDWORD) ((PBYTE) authinf + auth_len);
|
||||
while (csp < csp_end)
|
||||
checksum += *csp++;
|
||||
if (authinf->checksum != checksum)
|
||||
return STATUS_INVALID_PARAMETER_3;
|
||||
|
||||
/* Set account to username and authority to domain resp. machine name.
|
||||
The name of the logon account name as returned by LookupAccountSid
|
||||
is created from here as "authority\account". */
|
||||
authinf->username[UNLEN] = '\0';
|
||||
ulen = mbstowcs (user, authinf->username, UNLEN + 1);
|
||||
authinf->domain[INTERNET_MAX_HOST_NAME_LENGTH] = '\0';
|
||||
dlen = mbstowcs (domain, authinf->domain, INTERNET_MAX_HOST_NAME_LENGTH + 1);
|
||||
if (account && !(*account = uni_alloc (user, ulen)))
|
||||
return STATUS_NO_MEMORY;
|
||||
if (authority && !(*authority = uni_alloc (domain, dlen)))
|
||||
return STATUS_NO_MEMORY;
|
||||
/* Create a fake buffer in pbuf which is free'd again in the client.
|
||||
Windows 2000 tends to crash when setting this pointer to NULL. */
|
||||
if (pbuf)
|
||||
{
|
||||
stat = funcs->AllocateClientBuffer (request, 64UL, pbuf);
|
||||
if (!LSA_SUCCESS (stat))
|
||||
return stat;
|
||||
}
|
||||
if (pbuf_len)
|
||||
*pbuf_len = 64UL;
|
||||
|
||||
/* A PLSA_TOKEN_INFORMATION_V2 is allocated in one piece, so... */
|
||||
#if defined (__x86_64__) || defined (_M_AMD64)
|
||||
{
|
||||
/* ...on 64 bit systems we have to convert the incoming 32 bit offsets
|
||||
into 64 bit pointers. That requires to re-evaluate the size of the
|
||||
outgoing tokinf structure and a somewhat awkward procedure to copy
|
||||
the information over. */
|
||||
LONG_PTR base;
|
||||
PBYTE tptr;
|
||||
DWORD size, newsize;
|
||||
PSID src_sid;
|
||||
PCYG_TOKEN_GROUPS src_grps;
|
||||
PTOKEN_GROUPS grps;
|
||||
PTOKEN_PRIVILEGES src_privs;
|
||||
PACL src_acl;
|
||||
|
||||
base = (LONG_PTR) &authinf->inf;
|
||||
|
||||
newsize = authinf->inf_size;
|
||||
newsize += sizeof (PSID) - sizeof (OFFSET); /* User SID */
|
||||
newsize += sizeof (PTOKEN_GROUPS) - sizeof (OFFSET); /* Groups */
|
||||
src_grps = (PCYG_TOKEN_GROUPS) (base + authinf->inf.Groups);
|
||||
newsize += src_grps->GroupCount /* Group SIDs */
|
||||
* (sizeof (PSID) - sizeof (OFFSET));
|
||||
newsize += sizeof (PSID) - sizeof (OFFSET); /* Primary Group SID */
|
||||
newsize += sizeof (PSID) - sizeof (OFFSET); /* Owner SID */
|
||||
newsize += sizeof (PACL) - sizeof (OFFSET); /* Default DACL */
|
||||
if (!(tokinf = funcs->AllocateLsaHeap (newsize)))
|
||||
return STATUS_NO_MEMORY;
|
||||
tptr = (PBYTE)(tokinf + 1);
|
||||
|
||||
tokinf->ExpirationTime = authinf->inf.ExpirationTime;
|
||||
/* User SID */
|
||||
src_sid = (PSID) (base + authinf->inf.User.User.Sid);
|
||||
size = GetLengthSid (src_sid);
|
||||
CopySid (size, (PSID) tptr, src_sid);
|
||||
tokinf->User.User.Sid = (PSID) tptr;
|
||||
tptr += size;
|
||||
tokinf->User.User.Attributes = authinf->inf.User.User.Attributes;
|
||||
/* Groups */
|
||||
grps = (PTOKEN_GROUPS) tptr;
|
||||
tokinf->Groups = grps;
|
||||
grps->GroupCount = src_grps->GroupCount;
|
||||
tptr += sizeof grps->GroupCount
|
||||
+ grps->GroupCount * sizeof (SID_AND_ATTRIBUTES);
|
||||
/* Group SIDs */
|
||||
for (i = 0; i < src_grps->GroupCount; ++i)
|
||||
{
|
||||
src_sid = (PSID) (base + src_grps->Groups[i].Sid);
|
||||
size = GetLengthSid (src_sid);
|
||||
CopySid (size, (PSID) tptr, src_sid);
|
||||
tokinf->Groups->Groups[i].Sid = (PSID) tptr;
|
||||
tptr += size;
|
||||
tokinf->Groups->Groups[i].Attributes = src_grps->Groups[i].Attributes;
|
||||
}
|
||||
/* Primary Group SID */
|
||||
src_sid = (PSID) (base + authinf->inf.PrimaryGroup.PrimaryGroup);
|
||||
size = GetLengthSid (src_sid);
|
||||
CopySid (size, (PSID) tptr, src_sid);
|
||||
tokinf->PrimaryGroup.PrimaryGroup = (PSID) tptr;
|
||||
tptr += size;
|
||||
/* Privileges */
|
||||
src_privs = (PTOKEN_PRIVILEGES) (base + authinf->inf.Privileges);
|
||||
size = sizeof src_privs->PrivilegeCount
|
||||
+ src_privs->PrivilegeCount * sizeof (LUID_AND_ATTRIBUTES);
|
||||
memcpy (tptr, src_privs, size);
|
||||
tokinf->Privileges = (PTOKEN_PRIVILEGES) tptr;
|
||||
tptr += size;
|
||||
/* Owner */
|
||||
tokinf->Owner.Owner = NULL;
|
||||
/* Default DACL */
|
||||
src_acl = (PACL) (base + authinf->inf.DefaultDacl.DefaultDacl);
|
||||
size = src_acl->AclSize;
|
||||
memcpy (tptr, src_acl, size);
|
||||
tokinf->DefaultDacl.DefaultDacl = (PACL) tptr;
|
||||
}
|
||||
#else
|
||||
{
|
||||
/* ...on 32 bit systems we just allocate tokinf with the same size as
|
||||
we get, copy the whole structure and convert offsets into pointers. */
|
||||
|
||||
/* Allocate LUID for usage in the logon SID on Windows 2000. This is
|
||||
not done in the 64 bit code above for hopefully obvious reasons... */
|
||||
LUID logon_sid_id;
|
||||
|
||||
if (must_create_logon_sid && !AllocateLocallyUniqueId (&logon_sid_id))
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
if (!(tokinf = funcs->AllocateLsaHeap (authinf->inf_size)))
|
||||
return STATUS_NO_MEMORY;
|
||||
memcpy (tokinf, &authinf->inf, authinf->inf_size);
|
||||
|
||||
/* User SID */
|
||||
tokinf->User.User.Sid = (PSID)
|
||||
((PBYTE) tokinf + (LONG_PTR) tokinf->User.User.Sid);
|
||||
/* Groups */
|
||||
tokinf->Groups = (PTOKEN_GROUPS)
|
||||
((PBYTE) tokinf + (LONG_PTR) tokinf->Groups);
|
||||
/* Group SIDs */
|
||||
for (i = 0; i < tokinf->Groups->GroupCount; ++i)
|
||||
{
|
||||
tokinf->Groups->Groups[i].Sid = (PSID)
|
||||
((PBYTE) tokinf + (LONG_PTR) tokinf->Groups->Groups[i].Sid);
|
||||
if (must_create_logon_sid
|
||||
&& tokinf->Groups->Groups[i].Attributes & SE_GROUP_LOGON_ID
|
||||
&& *GetSidSubAuthorityCount (tokinf->Groups->Groups[i].Sid) == 3
|
||||
&& *GetSidSubAuthority (tokinf->Groups->Groups[i].Sid, 0)
|
||||
== SECURITY_LOGON_IDS_RID)
|
||||
{
|
||||
*GetSidSubAuthority (tokinf->Groups->Groups[i].Sid, 1)
|
||||
= logon_sid_id.HighPart;
|
||||
*GetSidSubAuthority (tokinf->Groups->Groups[i].Sid, 2)
|
||||
= logon_sid_id.LowPart;
|
||||
}
|
||||
}
|
||||
|
||||
/* Primary Group SID */
|
||||
tokinf->PrimaryGroup.PrimaryGroup = (PSID)
|
||||
((PBYTE) tokinf + (LONG_PTR) tokinf->PrimaryGroup.PrimaryGroup);
|
||||
/* Privileges */
|
||||
tokinf->Privileges = (PTOKEN_PRIVILEGES)
|
||||
((PBYTE) tokinf + (LONG_PTR) tokinf->Privileges);
|
||||
/* Owner SID */
|
||||
tokinf->Owner.Owner = NULL;
|
||||
/* Default DACL */
|
||||
tokinf->DefaultDacl.DefaultDacl = (PACL)
|
||||
((PBYTE) tokinf + (LONG_PTR) tokinf->DefaultDacl.DefaultDacl);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
*tok = (PVOID) tokinf;
|
||||
*tok_type = LsaTokenInformationV2;
|
||||
|
||||
#ifdef DEBUGGING
|
||||
print_tokinf (tokinf, authinf->inf_size, authinf, &authinf->inf,
|
||||
(PVOID)((LONG_PTR) &authinf->inf + authinf->inf_size));
|
||||
#endif
|
||||
|
||||
/* Create logon session. */
|
||||
if (!AllocateLocallyUniqueId (logon_id))
|
||||
{
|
||||
funcs->FreeLsaHeap (*tok);
|
||||
*tok = NULL;
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
stat = funcs->CreateLogonSession (logon_id);
|
||||
if (stat != STATUS_SUCCESS)
|
||||
{
|
||||
funcs->FreeLsaHeap (*tok);
|
||||
*tok = NULL;
|
||||
return stat;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID NTAPI
|
||||
LsaApLogonTerminated(PLUID LogonId)
|
||||
{
|
||||
}
|
||||
|
||||
NTSTATUS NTAPI
|
||||
LsaApCallPackage (PLSA_CLIENT_REQUEST request, PVOID authinf,
|
||||
PVOID client_auth_base, ULONG auth_len, PVOID *ret_buf,
|
||||
PULONG ret_buf_len, PNTSTATUS ret_stat)
|
||||
{
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
9
winsup/lsaauth/cyglsa.din
Normal file
9
winsup/lsaauth/cyglsa.din
Normal file
@ -0,0 +1,9 @@
|
||||
LIBRARY "cyglsa"
|
||||
|
||||
EXPORTS
|
||||
LsaApInitializePackage = LsaApInitializePackage@20
|
||||
LsaApLogonUser = LsaApLogonUser@52
|
||||
LsaApLogonTerminated = LsaApLogonTerminated@4
|
||||
LsaApCallPackage = LsaApCallPackage@28
|
||||
LsaApCallPackagePassthrough = LsaApCallPackage@28
|
||||
LsaApCallPackageUntrusted = LsaApCallPackage@28
|
BIN
winsup/lsaauth/cyglsa64.dll
Normal file
BIN
winsup/lsaauth/cyglsa64.dll
Normal file
Binary file not shown.
16
winsup/lsaauth/make-64bit-version-with-visual-c.bat
Normal file
16
winsup/lsaauth/make-64bit-version-with-visual-c.bat
Normal file
@ -0,0 +1,16 @@
|
||||
@echo off
|
||||
rem This batchfile shows how to generate a 64 bit version of cyglsa.dll.
|
||||
rem The 32 bit version will not work on 64 bit systems.
|
||||
rem
|
||||
rem Note that you need not only the SDK headers and libs, but also the
|
||||
rem 64 bit ntdll.lib file from a DDK supporting 64 bit builds.
|
||||
rem
|
||||
rem This can be used as long as no x86_64-pe/coff capable gcc is available.
|
||||
rem Note that this is for building inside the source dir as not to interfere
|
||||
rem with the "official" 32 bit build in the build directory.
|
||||
rem
|
||||
rem Install the dll into /bin and use the cyglsa-config script to register it.
|
||||
rem Don't forget to reboot afterwards.
|
||||
rem
|
||||
cl /Wp64 /c cyglsa.c
|
||||
link /nodefaultlib /dll /machine:x64 /entry:DllMain /out:cyglsa64.dll /def:mslsa.def cyglsa.obj runtmchk.lib advapi32.lib kernel32.lib ntdll.lib
|
9
winsup/lsaauth/mslsa.def
Normal file
9
winsup/lsaauth/mslsa.def
Normal file
@ -0,0 +1,9 @@
|
||||
LIBRARY "cyglsa64"
|
||||
|
||||
EXPORTS
|
||||
LsaApInitializePackage
|
||||
LsaApLogonUser
|
||||
LsaApLogonTerminated
|
||||
LsaApCallPackage
|
||||
LsaApCallPackagePassthrough = LsaApCallPackage
|
||||
LsaApCallPackageUntrusted = LsaApCallPackage
|
Loading…
Reference in New Issue
Block a user