Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4c944d236c | |||
| 46cc41933b | |||
| 388cb97893 | |||
| 81c4e06c3b | |||
| 4fcb8d510b | |||
| 2ff61e3c80 | |||
| 61472718df | |||
| b63aced4b3 | |||
| b532614a3b | |||
| 02f8995749 | |||
| cb56b9d10e | |||
| bdb2aa7202 | |||
| 7a3935ef98 | |||
| 9d0f797494 | |||
| 862809e6de | |||
| 0e71b4600c | |||
| fcee2d4028 | |||
| 3ee8ec58bb | |||
| d20c220441 | |||
| 451264e2b2 | |||
| d2ea0055d4 | |||
| d48226e507 | |||
| 1a19ece5ee | |||
| a70f9f8694 | |||
| 02ea908972 |
@@ -1,118 +0,0 @@
|
|||||||
NOTE:
|
|
||||||
This license has been obsoleted by the change to the BSD-style copyright.
|
|
||||||
You may continue to use this license if you wish, but you are under no
|
|
||||||
obligation to do so.
|
|
||||||
|
|
||||||
(*
|
|
||||||
This document is freely plagiarised from the 'Artistic Licence',
|
|
||||||
distributed as part of the Perl v4.0 kit by Larry Wall, which is
|
|
||||||
available from most major archive sites. I stole it from CrackLib.
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
*)
|
|
||||||
|
|
||||||
This documents purpose is to state the conditions under which this
|
|
||||||
Package (See definition below) viz: "Shadow", the Shadow Password Suite
|
|
||||||
which is held by Julianne Frances Haugh, may be copied, such that the
|
|
||||||
copyright holder maintains some semblance of artistic control over the
|
|
||||||
development of the package, while giving the users of the package the
|
|
||||||
right to use and distribute the Package in a more-or-less customary
|
|
||||||
fashion, plus the right to make reasonable modifications.
|
|
||||||
|
|
||||||
So there.
|
|
||||||
|
|
||||||
***************************************************************************
|
|
||||||
|
|
||||||
Definitions:
|
|
||||||
|
|
||||||
|
|
||||||
A "Package" refers to the collection of files distributed by the
|
|
||||||
Copyright Holder, and derivatives of that collection of files created
|
|
||||||
through textual modification, or segments thereof.
|
|
||||||
|
|
||||||
"Standard Version" refers to such a Package if it has not been modified,
|
|
||||||
or has been modified in accordance with the wishes of the Copyright
|
|
||||||
Holder.
|
|
||||||
|
|
||||||
"Copyright Holder" is whoever is named in the copyright or copyrights
|
|
||||||
for the package.
|
|
||||||
|
|
||||||
"You" is you, if you're thinking about copying or distributing this
|
|
||||||
Package.
|
|
||||||
|
|
||||||
"Reasonable copying fee" is whatever you can justify on the basis of
|
|
||||||
media cost, duplication charges, time of people involved, and so on.
|
|
||||||
(You will not be required to justify it to the Copyright Holder, but
|
|
||||||
only to the computing community at large as a market that must bear the
|
|
||||||
fee.)
|
|
||||||
|
|
||||||
"Freely Available" means that no fee is charged for the item itself,
|
|
||||||
though there may be fees involved in handling the item. It also means
|
|
||||||
that recipients of the item may redistribute it under the same
|
|
||||||
conditions they received it.
|
|
||||||
|
|
||||||
|
|
||||||
1. You may make and give away verbatim copies of the source form of the
|
|
||||||
Standard Version of this Package without restriction, provided that you
|
|
||||||
duplicate all of the original copyright notices and associated
|
|
||||||
disclaimers.
|
|
||||||
|
|
||||||
2. You may apply bug fixes, portability fixes and other modifications
|
|
||||||
derived from the Public Domain or from the Copyright Holder. A Package
|
|
||||||
modified in such a way shall still be considered the Standard Version.
|
|
||||||
|
|
||||||
3. You may otherwise modify your copy of this Package in any way,
|
|
||||||
provided that you insert a prominent notice in each changed file stating
|
|
||||||
how and when AND WHY you changed that file, and provided that you do at
|
|
||||||
least ONE of the following:
|
|
||||||
|
|
||||||
a) place your modifications in the Public Domain or otherwise make them
|
|
||||||
Freely Available, such as by posting said modifications to Usenet or an
|
|
||||||
equivalent medium, or placing the modifications on a major archive site
|
|
||||||
such as uunet.uu.net, or by allowing the Copyright Holder to include
|
|
||||||
your modifications in the Standard Version of the Package.
|
|
||||||
|
|
||||||
b) use the modified Package only within your corporation or organization.
|
|
||||||
|
|
||||||
c) rename any non-standard executables so the names do not conflict with
|
|
||||||
standard executables, which must also be provided, and provide separate
|
|
||||||
documentation for each non-standard executable that clearly documents
|
|
||||||
how it differs from the Standard Version.
|
|
||||||
|
|
||||||
d) make other distribution arrangements with the Copyright Holder.
|
|
||||||
|
|
||||||
4. You may distribute the programs of this Package in object code or
|
|
||||||
executable form, provided that you do at least ONE of the following:
|
|
||||||
|
|
||||||
a) distribute a Standard Version of the executables and library files,
|
|
||||||
together with instructions (in the manual page or equivalent) on where
|
|
||||||
to get the Standard Version.
|
|
||||||
|
|
||||||
b) accompany the distribution with the machine-readable source of the
|
|
||||||
Package with your modifications.
|
|
||||||
|
|
||||||
c) accompany any non-standard executables with their corresponding
|
|
||||||
Standard Version executables, giving the non-standard executables
|
|
||||||
non-standard names, and clearly documenting the differences in manual
|
|
||||||
pages (or equivalent), together with instructions on where to get the
|
|
||||||
Standard Version.
|
|
||||||
|
|
||||||
d) make other distribution arrangements with the Copyright Holder.
|
|
||||||
|
|
||||||
5. You may charge a reasonable copying fee for any distribution of this
|
|
||||||
Package. You may charge any fee you choose for support of this Package.
|
|
||||||
YOU MAY NOT CHARGE A FEE FOR THIS PACKAGE ITSELF. However, you may
|
|
||||||
distribute this Package in aggregate with other (possibly commercial)
|
|
||||||
programs as part of a larger (possibly commercial) software distribution
|
|
||||||
provided that YOU DO NOT ADVERTISE this package as a product of your
|
|
||||||
own.
|
|
||||||
|
|
||||||
6. The name of the Copyright Holder may not be used to endorse or
|
|
||||||
promote products derived from this software without specific prior
|
|
||||||
written permission.
|
|
||||||
|
|
||||||
7. THIS PACKAGE 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.
|
|
||||||
|
|
||||||
The End
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
EXTRA_DIST = NEWS README TODO shadow.spec.in
|
|
||||||
|
|
||||||
SUBDIRS = po man libmisc lib src \
|
|
||||||
contrib doc etc
|
|
||||||
-858
@@ -1,858 +0,0 @@
|
|||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 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 = man/po/Makefile shadow.spec
|
|
||||||
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)`
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
CSCOPE = cscope
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
|
|
||||||
$(srcdir)/shadow.spec.in $(top_srcdir)/man/po/Makefile.in \
|
|
||||||
ABOUT-NLS COPYING ChangeLog NEWS README TODO compile \
|
|
||||||
config.guess config.rpath config.sub install-sh ltmain.sh \
|
|
||||||
missing ylwrap
|
|
||||||
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 $(distdir).tar.xz
|
|
||||||
GZIP_ENV = --best
|
|
||||||
DIST_TARGETS = dist-xz dist-gzip
|
|
||||||
distuninstallcheck_listfiles = find . -type f -print
|
|
||||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
|
||||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
|
||||||
distcleancheck_listfiles = find . -type f -print
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
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@
|
|
||||||
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@
|
|
||||||
ECONF_CPPFLAGS = @ECONF_CPPFLAGS@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
FGREP = @FGREP@
|
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
|
||||||
GMSGFMT = @GMSGFMT@
|
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
|
||||||
GREP = @GREP@
|
|
||||||
GROUP_NAME_MAX_LENGTH = @GROUP_NAME_MAX_LENGTH@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
INTLLIBS = @INTLLIBS@
|
|
||||||
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBACL = @LIBACL@
|
|
||||||
LIBATTR = @LIBATTR@
|
|
||||||
LIBAUDIT = @LIBAUDIT@
|
|
||||||
LIBCRACK = @LIBCRACK@
|
|
||||||
LIBCRYPT = @LIBCRYPT@
|
|
||||||
LIBECONF = @LIBECONF@
|
|
||||||
LIBICONV = @LIBICONV@
|
|
||||||
LIBINTL = @LIBINTL@
|
|
||||||
LIBMD = @LIBMD@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBPAM = @LIBPAM@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LIBSELINUX = @LIBSELINUX@
|
|
||||||
LIBSEMANAGE = @LIBSEMANAGE@
|
|
||||||
LIBSKEY = @LIBSKEY@
|
|
||||||
LIBTCB = @LIBTCB@
|
|
||||||
LIBTOOL = @LIBTOOL@
|
|
||||||
LIPO = @LIPO@
|
|
||||||
LN_S = @LN_S@
|
|
||||||
LTLIBICONV = @LTLIBICONV@
|
|
||||||
LTLIBINTL = @LTLIBINTL@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
|
||||||
MAINT = @MAINT@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
MSGFMT = @MSGFMT@
|
|
||||||
MSGFMT_015 = @MSGFMT_015@
|
|
||||||
MSGMERGE = @MSGMERGE@
|
|
||||||
NM = @NM@
|
|
||||||
NMEDIT = @NMEDIT@
|
|
||||||
OBJDUMP = @OBJDUMP@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
OTOOL = @OTOOL@
|
|
||||||
OTOOL64 = @OTOOL64@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
POSUB = @POSUB@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
USE_NLS = @USE_NLS@
|
|
||||||
VENDORDIR = @VENDORDIR@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
XGETTEXT = @XGETTEXT@
|
|
||||||
XGETTEXT_015 = @XGETTEXT_015@
|
|
||||||
XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
|
|
||||||
XMLCATALOG = @XMLCATALOG@
|
|
||||||
XML_CATALOG_FILE = @XML_CATALOG_FILE@
|
|
||||||
XSLTPROC = @XSLTPROC@
|
|
||||||
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@
|
|
||||||
capcmd = @capcmd@
|
|
||||||
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@
|
|
||||||
EXTRA_DIST = NEWS README TODO shadow.spec.in
|
|
||||||
SUBDIRS = po man libmisc lib src \
|
|
||||||
contrib doc etc
|
|
||||||
|
|
||||||
all: config.h
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
am--refresh: Makefile
|
|
||||||
@:
|
|
||||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
echo ' cd $(srcdir) && $(AUTOMAKE) --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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
|
||||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
|
||||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
|
||||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
|
|
||||||
config.h: stamp-h1
|
|
||||||
@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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
|
||||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
|
||||||
rm -f stamp-h1
|
|
||||||
touch $@
|
|
||||||
|
|
||||||
distclean-hdr:
|
|
||||||
-rm -f config.h stamp-h1
|
|
||||||
man/po/Makefile: $(top_builddir)/config.status $(top_srcdir)/man/po/Makefile.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
|
||||||
shadow.spec: $(top_builddir)/config.status $(srcdir)/shadow.spec.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
|
||||||
|
|
||||||
mostlyclean-libtool:
|
|
||||||
-rm -f *.lo
|
|
||||||
|
|
||||||
clean-libtool:
|
|
||||||
-rm -rf .libs _libs
|
|
||||||
|
|
||||||
distclean-libtool:
|
|
||||||
-rm -f libtool config.lt
|
|
||||||
|
|
||||||
# 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-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 ;;\
|
|
||||||
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) dvi \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
|
||||||
distuninstallcheck \
|
|
||||||
&& chmod -R a-w "$$dc_install_base" \
|
|
||||||
&& ({ \
|
|
||||||
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
|
||||||
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
|
||||||
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
|
||||||
&& rm -rf "$$dc_destdir" \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
|
||||||
&& rm -rf $(DIST_ARCHIVES) \
|
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
|
||||||
&& cd "$$am__cwd" \
|
|
||||||
|| exit 1
|
|
||||||
$(am__post_remove_distdir)
|
|
||||||
@(echo "$(distdir) archives ready for distribution: "; \
|
|
||||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
|
||||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
|
||||||
distuninstallcheck:
|
|
||||||
@test -n '$(distuninstallcheck_dir)' || { \
|
|
||||||
echo 'ERROR: trying to run $@ with an empty' \
|
|
||||||
'$$(distuninstallcheck_dir)' >&2; \
|
|
||||||
exit 1; \
|
|
||||||
}; \
|
|
||||||
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
|
||||||
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
|
||||||
exit 1; \
|
|
||||||
}; \
|
|
||||||
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
|
||||||
|| { echo "ERROR: files left after uninstall:" ; \
|
|
||||||
if test -n "$(DESTDIR)"; then \
|
|
||||||
echo " (check DESTDIR support)"; \
|
|
||||||
fi ; \
|
|
||||||
$(distuninstallcheck_listfiles) ; \
|
|
||||||
exit 1; } >&2
|
|
||||||
distcleancheck: distclean
|
|
||||||
@if test '$(srcdir)' = . ; then \
|
|
||||||
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
|
||||||
exit 1 ; \
|
|
||||||
fi
|
|
||||||
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
|
||||||
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
|
||||||
$(distcleancheck_listfiles) ; \
|
|
||||||
exit 1; } >&2
|
|
||||||
check-am: all-am
|
|
||||||
check: check-recursive
|
|
||||||
all-am: Makefile 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 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
|
|
||||||
|
|
||||||
|
|
||||||
# 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:
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
Shadow SITES
|
|
||||||
============
|
|
||||||
|
|
||||||
Homepage
|
|
||||||
http://github.com/shadow-maint/shadow
|
|
||||||
|
|
||||||
Issue tracker
|
|
||||||
http://github.com/shadow-maint/shadow/issues
|
|
||||||
|
|
||||||
Releases
|
|
||||||
https://github.com/shadow-maint/shadow/releases
|
|
||||||
|
|
||||||
Mailing lists
|
|
||||||
for general discuss: pkg-shadow-devel@lists.alioth.debian.org
|
|
||||||
commit list: pkg-shadow-commits@lists.alioth.debian.org
|
|
||||||
|
|
||||||
Mailing lists subscription
|
|
||||||
http://lists.alioth.debian.org/mailman/listinfo/pkg-shadow-devel
|
|
||||||
http://lists.alioth.debian.org/mailman/listinfo/pkg-shadow-commits
|
|
||||||
|
|
||||||
Mailing lists archives:
|
|
||||||
http://lists.alioth.debian.org/pipermail/pkg-shadow-devel/
|
|
||||||
http://lists.alioth.debian.org/pipermail/pkg-shadow-commits/
|
|
||||||
|
|
||||||
S/Key support:
|
|
||||||
Shadow can be built with S/Key support using the S/Key package from:
|
|
||||||
|
|
||||||
http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libskey/
|
|
||||||
or
|
|
||||||
http://gentoo.osuosl.org/distfiles/skey-1.1.5.tar.bz2
|
|
||||||
|
|
||||||
Authors and contributors
|
|
||||||
========================
|
|
||||||
|
|
||||||
Thanks to at least the following people for sending patches, bug
|
|
||||||
reports and various comments. This list may be incomplete, I received
|
|
||||||
a lot of mail...
|
|
||||||
|
|
||||||
|
|
||||||
Adam Rudnicki <adam@v-lo.krakow.pl>
|
|
||||||
Alan Curry <pacman@tardis.mars.net>
|
|
||||||
Aleksa Sarai <cyphar@cyphar.com>
|
|
||||||
Alexander O. Yuriev <alex@bach.cis.temple.edu>
|
|
||||||
Algis Rudys <arudys@rice.edu>
|
|
||||||
Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
|
||||||
Aniello Del Sorbo <anidel@edu-gw.dia.unisa.it>
|
|
||||||
Anton Gluck <gluc@midway.uchicago.edu>
|
|
||||||
Arkadiusz Miskiewicz <misiek@pld.org.pl>
|
|
||||||
Ben Collins <bcollins@debian.org>
|
|
||||||
Brian R. Gaeke <brg@dgate.org>
|
|
||||||
Calle Karlsson <ckn@kash.se>
|
|
||||||
Chip Rosenthal <chip@unicom.com>
|
|
||||||
Chris Evans <lady0110@sable.ox.ac.uk>
|
|
||||||
Chris Lamb <chris@chris-lamb.co.uk>
|
|
||||||
Cristian Gafton <gafton@sorosis.ro>
|
|
||||||
Dan Walsh <dwalsh@redhat.com>
|
|
||||||
Darcy Boese <possum@chardonnay.niagara.com>
|
|
||||||
Dave Hagewood <admin@arrowweb.com>
|
|
||||||
David A. Holland <dholland@hcs.harvard.edu>
|
|
||||||
David Frey <David.Frey@lugs.ch>
|
|
||||||
Ed Carp <ecarp@netcom.com>
|
|
||||||
Eric W. Biederman" <ebiederm@xmission.com>
|
|
||||||
Floody <flood@evcom.net>
|
|
||||||
Frank Denis <j@4u.net>
|
|
||||||
George Kraft IV <gk4@us.ibm.com>
|
|
||||||
Greg Mortensen <loki@world.std.com>
|
|
||||||
Guido van Rooij
|
|
||||||
Guy Maor <maor@debian.org>
|
|
||||||
Hrvoje Dogan <hdogan@bjesomar.srce.hr>
|
|
||||||
Jakub Hrozek <jhrozek@redhat.com>
|
|
||||||
Janos Farkas <chexum@bankinf.banki.hu>
|
|
||||||
Jay Soffian <jay@lw.net>
|
|
||||||
Jesse Thilo <Jesse.Thilo@pobox.com>
|
|
||||||
Joey Hess <joey@kite.ml.org>
|
|
||||||
John Adelsberger <jja@umr.edu>
|
|
||||||
Jonathan Hankins <jhankins@mailserv.homewood.k12.al.us>
|
|
||||||
Jon Lewis <jlewis@lewis.org>
|
|
||||||
Joshua Cowan <jcowan@hermit.reslife.okstate.edu>
|
|
||||||
Judd Bourgeois <shagboy@bluesky.net>
|
|
||||||
Juergen Heinzl <unicorn@noris.net>
|
|
||||||
Juha Virtanen <jiivee@iki.fi>
|
|
||||||
Julian Pidancet <julian.pidancet@gmail.com>
|
|
||||||
Julianne Frances Haugh <jockgrrl@ix.netcom.com>
|
|
||||||
Leonard N. Zubkoff <lnz@dandelion.com>
|
|
||||||
Luca Berra <bluca@www.polimi.it>
|
|
||||||
Lukáš Kuklínek <lkukline@redhat.com>
|
|
||||||
Lutz Schwalowsky <schwalow@mineralogie.uni-hamburg.de>
|
|
||||||
Marc Ewing <marc@redhat.com>
|
|
||||||
Martin Bene <mb@sime.com>
|
|
||||||
Martin Mares <mj@gts.cz>
|
|
||||||
Michael Meskes <meskes@topsystem.de>
|
|
||||||
Michael Talbot-Wilson <mike@calypso.bns.com.au>
|
|
||||||
Mike Frysinger <vapier@gentoo.org>
|
|
||||||
Mike Pakovic <mpakovic@users.southeast.net>
|
|
||||||
Nicolas François <nicolas.francois@centraliens.net>
|
|
||||||
Nikos Mavroyanopoulos <nmav@i-net.paiko.gr>
|
|
||||||
Pavel Machek <pavel@bug.ucw.cz>
|
|
||||||
Peter Vrabec <pvrabec@redhat.com>
|
|
||||||
Phillip Street
|
|
||||||
Rafał Maszkowski <rzm@icm.edu.pl>
|
|
||||||
Rani Chouha <ranibey@smartec.com>
|
|
||||||
Sami Kerola <kerolasa@rocketmail.com>
|
|
||||||
Scott Garman <scott.a.garman@intel.com>
|
|
||||||
Sebastian Rick Rijkers <srrijkers@gmail.com>
|
|
||||||
Seraphim Mellos <mellos@ceid.upatras.gr>
|
|
||||||
Shane Watts <shane@nexus.mlckew.edu.au>
|
|
||||||
Steve M. Robbins <steve@nyongwa.montreal.qc.ca>
|
|
||||||
Thorsten Kukuk <kukuk@suse.de>
|
|
||||||
Tim Hockin <thockin@eagle.ais.net>
|
|
||||||
Timo Karjalainen <timok@iki.fi>
|
|
||||||
Ulisses Alonso Camaro <ulisses@pusa.eleinf.uv.es>
|
|
||||||
Werner Fink <werner@suse.de>
|
|
||||||
|
|
||||||
Maintainers
|
|
||||||
===========
|
|
||||||
|
|
||||||
Tomasz Kłoczko <kloczek@pld.org.pl> (2000-2007)
|
|
||||||
Nicolas François <nicolas.francois@centraliens.net> (2007-2014)
|
|
||||||
Serge E. Hallyn <serge@hallyn.com> (2014-now)
|
|
||||||
Christian Brauner <christian@brauner.io> (2019-now)
|
|
||||||
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
* Create a common usage function that'd take the array of
|
|
||||||
long options and an array of descriptions and output that so things would
|
|
||||||
be standardized across the utils.
|
|
||||||
Usage strings should be normalized and split first.
|
|
||||||
Investigate optparse.
|
|
||||||
|
|
||||||
|
|
||||||
/etc/default/useradd
|
|
||||||
* GROUP=1000 should accept a group name.
|
|
||||||
|
|
||||||
Check when RLOGIN is enabled if ruserok() exists
|
|
||||||
|
|
||||||
Move selinux_file_context out of libmisc/copydir.c
|
|
||||||
|
|
||||||
Review hardcoded root account?
|
|
||||||
|
|
||||||
review all call to strto
|
|
||||||
|
|
||||||
libmisc/cleanup_user.c
|
|
||||||
cleanup needed (cleanup_report_add_user* not used)
|
|
||||||
|
|
||||||
|
|
||||||
libxcrypt support
|
|
||||||
* http://wiki.linuxfromscratch.org/patches/browser/trunk/shadow/shadow-4.0.18.1-owl_blowfish-1.patch
|
|
||||||
|
|
||||||
implement getlong, getulong.
|
|
||||||
avoid atoi, atol, atoul, strtol, strtoul, ...
|
|
||||||
|
|
||||||
manpages: comment the RLOGIN parts
|
|
||||||
|
|
||||||
Replace build_list (in lib/gshadow.c) and list (in lib/sgetgrent.c) by
|
|
||||||
comma_to_list()
|
|
||||||
|
|
||||||
Revert the modified files if all files could not be changed.
|
|
||||||
* or warn and indicate which files were modified and which were not.
|
|
||||||
* check the order the files are modified.
|
|
||||||
|
|
||||||
report nscd_flush_cache failures?
|
|
||||||
call nscd from the programs or from lib (commonio?)
|
|
||||||
|
|
||||||
PAM: check if a non-interactive conversation function could be used to set
|
|
||||||
the password in chpasswd and newusers
|
|
||||||
|
|
||||||
WITH_SELINUX
|
|
||||||
- review all tools to check that the strategies are consistent
|
|
||||||
|
|
||||||
chage, chfn, chsh: same change needed as in passwd.
|
|
||||||
- probably need moving check_selinux_access to a separate file.
|
|
||||||
|
|
||||||
testsuite
|
|
||||||
- newgrp
|
|
||||||
- test with unknown user's GID
|
|
||||||
|
|
||||||
newusers
|
|
||||||
- add logging to SYSLOG & AUDIT
|
|
||||||
- use CREATE_HOME
|
|
||||||
- Add a -Z option (see useradd / usermod)
|
|
||||||
|
|
||||||
Document when/where option appeared, document whether an option is standard
|
|
||||||
or not.
|
|
||||||
|
|
||||||
Check all the expiry semantics
|
|
||||||
|
|
||||||
ALL:
|
|
||||||
- move base passwd/shadow/group/gshadow operation to module for allow write
|
|
||||||
different backend modules for db, NIS, LDAP and others. Default backend it
|
|
||||||
will be goot if will be chosen depending on /etc/nsswitch.conf and allow
|
|
||||||
override this by -r <repository> options (where the <repository> can be
|
|
||||||
file, db, nis nisplus, ldap .. like on /etc/nsswitch.conf in service column).
|
|
||||||
passwd have old piece of code with handling -r option and it will be good
|
|
||||||
finish this and propagate on other shadow tools for allow operate on other
|
|
||||||
user databases by well known tools.
|
|
||||||
- Protect against signals. Register do_cleanups in a signal handler.
|
|
||||||
|
|
||||||
- login.defs
|
|
||||||
- generate depending on configuration
|
|
||||||
|
|
||||||
- useradd:
|
|
||||||
- add handle create user mail spool in maildir format.
|
|
||||||
- Add support for -k in -D mode
|
|
||||||
- Add support for -K in -D mode
|
|
||||||
- Add option to create or not the mail spool (and set the default in -D
|
|
||||||
mode)
|
|
||||||
- Change -l to reset the entry if an entry was already there
|
|
||||||
- set the mask in mkdir?
|
|
||||||
|
|
||||||
- userdel:
|
|
||||||
- add backup option for the removal of user resources,
|
|
||||||
- user_busy: check that the user is not running any processes.
|
|
||||||
- missing "deleting group" FAILED
|
|
||||||
- home dir removed, but userdel may fail and may leave the user
|
|
||||||
=> warning needed
|
|
||||||
|
|
||||||
- usermod
|
|
||||||
- add an option equivalent to useradd's -l (only when uid is changed)
|
|
||||||
- the mode of new home directories should be set according to the
|
|
||||||
original mode. Does copy_tree does this?
|
|
||||||
- user renamed, order is not kept in /etc/group (see
|
|
||||||
47_usermod-l_no_shadow_file). This is a problem when the first user is
|
|
||||||
considered as the admin.
|
|
||||||
- see mail "user ID change" on April, 15
|
|
||||||
+ fix call to chown (combination of -m and -u/-g)
|
|
||||||
+ add tests
|
|
||||||
|
|
||||||
- passwd:
|
|
||||||
- check combination of options (e.g. -u/-l)
|
|
||||||
- when -u refuse to unlock because it would create an empty password, it
|
|
||||||
should not display "Password changed."
|
|
||||||
exit instead?
|
|
||||||
|
|
||||||
- newgrp: check the USE_PAM section.
|
|
||||||
|
|
||||||
- pwck
|
|
||||||
- Add check to move passwd passwords to shadow if there is a shadow
|
|
||||||
entry (with a password).
|
|
||||||
- Add check to move passwd passwords to shadow if there is a shadow
|
|
||||||
file.
|
|
||||||
- Support an alternative /etc/tcb directory as second parameter.
|
|
||||||
- add options -g / -G to specify alternative group / gshadow files
|
|
||||||
|
|
||||||
- su
|
|
||||||
- add a login.defs configuration parameter to add variables to keep in
|
|
||||||
the environment with "su -l" (TERM/TERMCOLOR/...)
|
|
||||||
|
|
||||||
- vipw
|
|
||||||
- set ACLs and XATTRs on the temporary file (and backups?)
|
|
||||||
- vipw + selinux -> use lib/selinux.c
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# Checks the location of the XML Catalog
|
|
||||||
# Usage:
|
|
||||||
# JH_PATH_XML_CATALOG([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
|
||||||
# Defines XMLCATALOG and XML_CATALOG_FILE substitutions
|
|
||||||
AC_DEFUN([JH_PATH_XML_CATALOG],
|
|
||||||
[
|
|
||||||
# check for the presence of the XML catalog
|
|
||||||
AC_ARG_WITH([xml-catalog],
|
|
||||||
AC_HELP_STRING([--with-xml-catalog=CATALOG],
|
|
||||||
[path to xml catalog to use]),,
|
|
||||||
[with_xml_catalog=/etc/xml/catalog])
|
|
||||||
jh_found_xmlcatalog=true
|
|
||||||
XML_CATALOG_FILE="$with_xml_catalog"
|
|
||||||
AC_SUBST([XML_CATALOG_FILE])
|
|
||||||
AC_MSG_CHECKING([for XML catalog ($XML_CATALOG_FILE)])
|
|
||||||
if test -f "$XML_CATALOG_FILE"; then
|
|
||||||
AC_MSG_RESULT([found])
|
|
||||||
else
|
|
||||||
jh_found_xmlcatalog=false
|
|
||||||
AC_MSG_RESULT([not found])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check for the xmlcatalog program
|
|
||||||
AC_PATH_PROG(XMLCATALOG, xmlcatalog, no)
|
|
||||||
if test "x$XMLCATALOG" = xno; then
|
|
||||||
jh_found_xmlcatalog=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
if $jh_found_xmlcatalog; then
|
|
||||||
ifelse([$1],,[:],[$1])
|
|
||||||
else
|
|
||||||
ifelse([$2],,[AC_MSG_ERROR([could not find XML catalog])],[$2])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
# Checks if a particular URI appears in the XML catalog
|
|
||||||
# Usage:
|
|
||||||
# JH_CHECK_XML_CATALOG(URI, [FRIENDLY-NAME], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
|
||||||
AC_DEFUN([JH_CHECK_XML_CATALOG],
|
|
||||||
[
|
|
||||||
AC_REQUIRE([JH_PATH_XML_CATALOG],[JH_PATH_XML_CATALOG(,[:])])dnl
|
|
||||||
AC_MSG_CHECKING([for ifelse([$2],,[$1],[$2]) in XML catalog])
|
|
||||||
if $jh_found_xmlcatalog && \
|
|
||||||
AC_RUN_LOG([$XMLCATALOG --noout "$XML_CATALOG_FILE" "$1" >&2]); then
|
|
||||||
AC_MSG_RESULT([found])
|
|
||||||
ifelse([$3],,,[$3
|
|
||||||
])dnl
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([not found])
|
|
||||||
ifelse([$4],,
|
|
||||||
[AC_MSG_ERROR([could not find ifelse([$2],,[$1],[$2]) in XML catalog])],
|
|
||||||
[$4])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
Vendored
-12678
File diff suppressed because it is too large
Load Diff
@@ -1,348 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
|
|
||||||
# We need space, tab and new line, in precisely that order. Quoting is
|
|
||||||
# there to prevent tools from complaining about whitespace usage.
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
file_conv=
|
|
||||||
|
|
||||||
# func_file_conv build_file lazy
|
|
||||||
# Convert a $build file to $host form and store it in $file
|
|
||||||
# Currently only supports Windows hosts. If the determined conversion
|
|
||||||
# type is listed in (the comma separated) LAZY, no conversion will
|
|
||||||
# take place.
|
|
||||||
func_file_conv ()
|
|
||||||
{
|
|
||||||
file=$1
|
|
||||||
case $file in
|
|
||||||
/ | /[!/]*) # absolute file, and not a UNC file
|
|
||||||
if test -z "$file_conv"; then
|
|
||||||
# lazily determine how to convert abs files
|
|
||||||
case `uname -s` in
|
|
||||||
MINGW*)
|
|
||||||
file_conv=mingw
|
|
||||||
;;
|
|
||||||
CYGWIN*)
|
|
||||||
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/*)
|
|
||||||
file=`cygpath -m "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
wine/*)
|
|
||||||
file=`winepath -w "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashL linkdir
|
|
||||||
# Make cl look for libraries in LINKDIR
|
|
||||||
func_cl_dashL ()
|
|
||||||
{
|
|
||||||
func_file_conv "$1"
|
|
||||||
if test -z "$lib_path"; then
|
|
||||||
lib_path=$file
|
|
||||||
else
|
|
||||||
lib_path="$lib_path;$file"
|
|
||||||
fi
|
|
||||||
linker_opts="$linker_opts -LIBPATH:$file"
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashl library
|
|
||||||
# Do a library search-path lookup for cl
|
|
||||||
func_cl_dashl ()
|
|
||||||
{
|
|
||||||
lib=$1
|
|
||||||
found=no
|
|
||||||
save_IFS=$IFS
|
|
||||||
IFS=';'
|
|
||||||
for dir in $lib_path $LIB
|
|
||||||
do
|
|
||||||
IFS=$save_IFS
|
|
||||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.dll.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/$lib.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/lib$lib.a"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/lib$lib.a
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS=$save_IFS
|
|
||||||
|
|
||||||
if test "$found" != yes; then
|
|
||||||
lib=$lib.lib
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_wrapper cl arg...
|
|
||||||
# Adjust compile command to suit cl
|
|
||||||
func_cl_wrapper ()
|
|
||||||
{
|
|
||||||
# Assume a capable shell
|
|
||||||
lib_path=
|
|
||||||
shared=:
|
|
||||||
linker_opts=
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.[oO][bB][jJ])
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fo"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fe"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
-I)
|
|
||||||
eat=1
|
|
||||||
func_file_conv "$2" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-I*)
|
|
||||||
func_file_conv "${1#-I}" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashl "$2"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l*)
|
|
||||||
func_cl_dashl "${1#-l}"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-L)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashL "$2"
|
|
||||||
;;
|
|
||||||
-L*)
|
|
||||||
func_cl_dashL "${1#-L}"
|
|
||||||
;;
|
|
||||||
-static)
|
|
||||||
shared=false
|
|
||||||
;;
|
|
||||||
-Wl,*)
|
|
||||||
arg=${1#-Wl,}
|
|
||||||
save_ifs="$IFS"; IFS=','
|
|
||||||
for flag in $arg; do
|
|
||||||
IFS="$save_ifs"
|
|
||||||
linker_opts="$linker_opts $flag"
|
|
||||||
done
|
|
||||||
IFS="$save_ifs"
|
|
||||||
;;
|
|
||||||
-Xlinker)
|
|
||||||
eat=1
|
|
||||||
linker_opts="$linker_opts $2"
|
|
||||||
;;
|
|
||||||
-*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
|
||||||
func_file_conv "$1"
|
|
||||||
set x "$@" -Tp"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
|
||||||
func_file_conv "$1" mingw
|
|
||||||
set x "$@" "$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
if test -n "$linker_opts"; then
|
|
||||||
linker_opts="-link$linker_opts"
|
|
||||||
fi
|
|
||||||
exec "$@" $linker_opts
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
eat=
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
||||||
arguments, and rename the output as expected.
|
|
||||||
|
|
||||||
If you are trying to build a whole package this is not the
|
|
||||||
right script to run: please start by reading the file 'INSTALL'.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
|
||||||
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
|
|
||||||
func_cl_wrapper "$@" # Doesn't return...
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ofile=
|
|
||||||
cfile=
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
# So we strip '-o arg' only if arg is an object.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.obj)
|
|
||||||
ofile=$2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" -o "$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.c)
|
|
||||||
cfile=$1
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$ofile" || test -z "$cfile"; then
|
|
||||||
# If no '-o' option was seen then we might have been invoked from a
|
|
||||||
# pattern rule where we don't need one. That is ok -- this is a
|
|
||||||
# normal compilation that the losing compiler can handle. If no
|
|
||||||
# '.c' file was seen then we are probably linking. That is also
|
|
||||||
# ok.
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Name of file we expect compiler to create.
|
|
||||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
|
||||||
|
|
||||||
# Create the lock directory.
|
|
||||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
|
||||||
# that we are using for the .o file. Also, base the name on the expected
|
|
||||||
# object file name, since that is what matters with a parallel build.
|
|
||||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
|
||||||
while true; do
|
|
||||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
# FIXME: race condition here if user kills between mkdir and trap.
|
|
||||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
||||||
|
|
||||||
# Run the compile.
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if test -f "$cofile"; then
|
|
||||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
|
||||||
elif test -f "${cofile}bj"; then
|
|
||||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rmdir "$lockdir"
|
|
||||||
exit $ret
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC0"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
||||||
Vendored
-1480
File diff suppressed because it is too large
Load Diff
-630
@@ -1,630 +0,0 @@
|
|||||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* Define if account management tools should be installed setuid and
|
|
||||||
authenticate the callers */
|
|
||||||
#undef ACCT_TOOLS_SETUID
|
|
||||||
|
|
||||||
/* Define to 1 if translation of program messages to the user's native
|
|
||||||
language is requested. */
|
|
||||||
#undef ENABLE_NLS
|
|
||||||
|
|
||||||
/* Define to support the subordinate IDs. */
|
|
||||||
#undef ENABLE_SUBIDS
|
|
||||||
|
|
||||||
/* Path for faillog file. */
|
|
||||||
#undef FAILLOG_FILE
|
|
||||||
|
|
||||||
/* Define to the type of elements in the array set by `getgroups'. Usually
|
|
||||||
this is either `int' or `gid_t'. */
|
|
||||||
#undef GETGROUPS_T
|
|
||||||
|
|
||||||
/* max group name length */
|
|
||||||
#undef GROUP_NAME_MAX_LENGTH
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of 'pam_fail_delay' */
|
|
||||||
#undef HAS_PAM_FAIL_DELAY
|
|
||||||
|
|
||||||
/* Defined to 1 if you have the declaration of 'secure_getenv' */
|
|
||||||
#undef HAS_SECURE_GETENV
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <acl/libacl.h> header file. */
|
|
||||||
#undef HAVE_ACL_LIBACL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <attr/error_context.h> header file. */
|
|
||||||
#undef HAVE_ATTR_ERROR_CONTEXT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <attr/libattr.h> header file. */
|
|
||||||
#undef HAVE_ATTR_LIBATTR_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
|
|
||||||
CoreFoundation framework. */
|
|
||||||
#undef HAVE_CFLOCALECOPYCURRENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
|
|
||||||
the CoreFoundation framework. */
|
|
||||||
#undef HAVE_CFPREFERENCESCOPYAPPVALUE
|
|
||||||
|
|
||||||
/* Define if the GNU dcgettext() function is already present or preinstalled.
|
|
||||||
*/
|
|
||||||
#undef HAVE_DCGETTEXT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `PAM_DATA_SILENT', and to 0 if
|
|
||||||
you don't. */
|
|
||||||
#undef HAVE_DECL_PAM_DATA_SILENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `PAM_DELETE_CRED', and to 0 if
|
|
||||||
you don't. */
|
|
||||||
#undef HAVE_DECL_PAM_DELETE_CRED
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `PAM_ESTABLISH_CRED', and to 0
|
|
||||||
if you don't. */
|
|
||||||
#undef HAVE_DECL_PAM_ESTABLISH_CRED
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `PAM_NEW_AUTHTOK_REQD', and to 0
|
|
||||||
if you don't. */
|
|
||||||
#undef HAVE_DECL_PAM_NEW_AUTHTOK_REQD
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
|
|
||||||
*/
|
|
||||||
#undef HAVE_DIRENT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
#undef HAVE_DLFCN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <errno.h> header file. */
|
|
||||||
#undef HAVE_ERRNO_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `fchmod' function. */
|
|
||||||
#undef HAVE_FCHMOD
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `fchown' function. */
|
|
||||||
#undef HAVE_FCHOWN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
|
||||||
#undef HAVE_FCNTL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `fsync' function. */
|
|
||||||
#undef HAVE_FSYNC
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `futimes' function. */
|
|
||||||
#undef HAVE_FUTIMES
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getaddrinfo' function. */
|
|
||||||
#undef HAVE_GETADDRINFO
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getgrgid_r' function. */
|
|
||||||
#undef HAVE_GETGRGID_R
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getgrnam_r' function. */
|
|
||||||
#undef HAVE_GETGRNAM_R
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getgroups' function. */
|
|
||||||
#undef HAVE_GETGROUPS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `gethostname' function. */
|
|
||||||
#undef HAVE_GETHOSTNAME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getpwnam_r' function. */
|
|
||||||
#undef HAVE_GETPWNAM_R
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getpwuid_r' function. */
|
|
||||||
#undef HAVE_GETPWUID_R
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getspnam' function. */
|
|
||||||
#undef HAVE_GETSPNAM
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getspnam_r' function. */
|
|
||||||
#undef HAVE_GETSPNAM_R
|
|
||||||
|
|
||||||
/* Define if the GNU gettext() function is already present or preinstalled. */
|
|
||||||
#undef HAVE_GETTEXT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `gettimeofday' function. */
|
|
||||||
#undef HAVE_GETTIMEOFDAY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getusershell' function. */
|
|
||||||
#undef HAVE_GETUSERSHELL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getutent' function. */
|
|
||||||
#undef HAVE_GETUTENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <gshadow.h> header file. */
|
|
||||||
#undef HAVE_GSHADOW_H
|
|
||||||
|
|
||||||
/* Define if you have the iconv() function and it works. */
|
|
||||||
#undef HAVE_ICONV
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `initgroups' function. */
|
|
||||||
#undef HAVE_INITGROUPS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `innetgr' function. */
|
|
||||||
#undef HAVE_INNETGR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#undef HAVE_INTTYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `l64a' function. */
|
|
||||||
#undef HAVE_L64A
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <lastlog.h> header file. */
|
|
||||||
#undef HAVE_LASTLOG_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `lchown' function. */
|
|
||||||
#undef HAVE_LCHOWN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `lckpwdf' function. */
|
|
||||||
#undef HAVE_LCKPWDF
|
|
||||||
|
|
||||||
/* Defined if you have libcrack. */
|
|
||||||
#undef HAVE_LIBCRACK
|
|
||||||
|
|
||||||
/* Defined if you have the ts&szs cracklib. */
|
|
||||||
#undef HAVE_LIBCRACK_HIST
|
|
||||||
|
|
||||||
/* Defined if it includes *Pw functions. */
|
|
||||||
#undef HAVE_LIBCRACK_PW
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <limits.h> header file. */
|
|
||||||
#undef HAVE_LIMITS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <linux/btrfs_tree.h> header file. */
|
|
||||||
#undef HAVE_LINUX_BTRFS_TREE_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <linux/magic.h> header file. */
|
|
||||||
#undef HAVE_LINUX_MAGIC_H
|
|
||||||
|
|
||||||
/* Define if struct lastlog has ll_host */
|
|
||||||
#undef HAVE_LL_HOST
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <locale.h> header file. */
|
|
||||||
#undef HAVE_LOCALE_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `lstat' function. */
|
|
||||||
#undef HAVE_LSTAT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `lutimes' function. */
|
|
||||||
#undef HAVE_LUTIMES
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memcpy' function. */
|
|
||||||
#undef HAVE_MEMCPY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#undef HAVE_MEMORY_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memset' function. */
|
|
||||||
#undef HAVE_MEMSET
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mkdir' function. */
|
|
||||||
#undef HAVE_MKDIR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
|
|
||||||
#undef HAVE_NDIR_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <netdb.h> header file. */
|
|
||||||
#undef HAVE_NETDB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <paths.h> header file. */
|
|
||||||
#undef HAVE_PATHS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `putgrent' function. */
|
|
||||||
#undef HAVE_PUTGRENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `putpwent' function. */
|
|
||||||
#undef HAVE_PUTPWENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `putspent' function. */
|
|
||||||
#undef HAVE_PUTSPENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `rename' function. */
|
|
||||||
#undef HAVE_RENAME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `rmdir' function. */
|
|
||||||
#undef HAVE_RMDIR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <rpc/key_prot.h> header file. */
|
|
||||||
#undef HAVE_RPC_KEY_PROT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ruserok' function. */
|
|
||||||
#undef HAVE_RUSEROK
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <security/openpam.h> header file. */
|
|
||||||
#undef HAVE_SECURITY_OPENPAM_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <security/pam_misc.h> header file. */
|
|
||||||
#undef HAVE_SECURITY_PAM_MISC_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <selinux/selinux.h> header file. */
|
|
||||||
#undef HAVE_SELINUX_SELINUX_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <semanage/semanage.h> header file. */
|
|
||||||
#undef HAVE_SEMANAGE_SEMANAGE_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `setgroups' function. */
|
|
||||||
#undef HAVE_SETGROUPS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sgetgrent' function. */
|
|
||||||
#undef HAVE_SGETGRENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sgetpwent' function. */
|
|
||||||
#undef HAVE_SGETPWENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sgetspent' function. */
|
|
||||||
#undef HAVE_SGETSPENT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sgtty.h> header file. */
|
|
||||||
#undef HAVE_SGTTY_H
|
|
||||||
|
|
||||||
/* Have working shadow group support in libc */
|
|
||||||
#undef HAVE_SHADOWGRP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sigaction' function. */
|
|
||||||
#undef HAVE_SIGACTION
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `snprintf' function. */
|
|
||||||
#undef HAVE_SNPRINTF
|
|
||||||
|
|
||||||
/* Define to 1 if stdbool.h conforms to C99. */
|
|
||||||
#undef HAVE_STDBOOL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#undef HAVE_STDLIB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strcasecmp' function. */
|
|
||||||
#undef HAVE_STRCASECMP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strchr' function. */
|
|
||||||
#undef HAVE_STRCHR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strdup' function. */
|
|
||||||
#undef HAVE_STRDUP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strerror' function. */
|
|
||||||
#undef HAVE_STRERROR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strftime' function. */
|
|
||||||
#undef HAVE_STRFTIME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#undef HAVE_STRING_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strstr' function. */
|
|
||||||
#undef HAVE_STRSTR
|
|
||||||
|
|
||||||
/* Define to 1 if `st_atim' is a member of `struct stat'. */
|
|
||||||
#undef HAVE_STRUCT_STAT_ST_ATIM
|
|
||||||
|
|
||||||
/* Define to 1 if `st_atimensec' is a member of `struct stat'. */
|
|
||||||
#undef HAVE_STRUCT_STAT_ST_ATIMENSEC
|
|
||||||
|
|
||||||
/* Define to 1 if `st_mtim' is a member of `struct stat'. */
|
|
||||||
#undef HAVE_STRUCT_STAT_ST_MTIM
|
|
||||||
|
|
||||||
/* Define to 1 if `st_mtimensec' is a member of `struct stat'. */
|
|
||||||
#undef HAVE_STRUCT_STAT_ST_MTIMENSEC
|
|
||||||
|
|
||||||
/* Define to 1 if `st_rdev' is a member of `struct stat'. */
|
|
||||||
#undef HAVE_STRUCT_STAT_ST_RDEV
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_addr' is a member of `struct utmpx'. */
|
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_ADDR
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_addr_v6' is a member of `struct utmpx'. */
|
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_ADDR_V6
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_host' is a member of `struct utmpx'. */
|
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_HOST
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_name' is a member of `struct utmpx'. */
|
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_NAME
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_syslen' is a member of `struct utmpx'. */
|
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_SYSLEN
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_time' is a member of `struct utmpx'. */
|
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_TIME
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_xtime' is a member of `struct utmpx'. */
|
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_XTIME
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_addr' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_ADDR
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_addr_v6' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_ADDR_V6
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_host' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_HOST
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_id' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_ID
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_name' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_NAME
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_syslen' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_SYSLEN
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_time' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_TIME
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_tv' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_TV
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_type' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_TYPE
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_user' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_USER
|
|
||||||
|
|
||||||
/* Define to 1 if `ut_xtime' is a member of `struct utmp'. */
|
|
||||||
#undef HAVE_STRUCT_UTMP_UT_XTIME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <syslog.h> header file. */
|
|
||||||
#undef HAVE_SYSLOG_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/capability.h> header file. */
|
|
||||||
#undef HAVE_SYS_CAPABILITY_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
|
|
||||||
*/
|
|
||||||
#undef HAVE_SYS_DIR_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
|
||||||
#undef HAVE_SYS_IOCTL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
|
|
||||||
*/
|
|
||||||
#undef HAVE_SYS_NDIR_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/resource.h> header file. */
|
|
||||||
#undef HAVE_SYS_RESOURCE_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/statfs.h> header file. */
|
|
||||||
#undef HAVE_SYS_STATFS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#undef HAVE_SYS_STAT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
|
||||||
#undef HAVE_SYS_TIME_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#undef HAVE_SYS_TYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
|
|
||||||
#undef HAVE_SYS_WAIT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <tcb.h> header file. */
|
|
||||||
#undef HAVE_TCB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <termios.h> header file. */
|
|
||||||
#undef HAVE_TERMIOS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <termio.h> header file. */
|
|
||||||
#undef HAVE_TERMIO_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <ulimit.h> header file. */
|
|
||||||
#undef HAVE_ULIMIT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#undef HAVE_UNISTD_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `updwtmp' function. */
|
|
||||||
#undef HAVE_UPDWTMP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `updwtmpx' function. */
|
|
||||||
#undef HAVE_UPDWTMPX
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <utime.h> header file. */
|
|
||||||
#undef HAVE_UTIME_H
|
|
||||||
|
|
||||||
/* Define to 1 if `utime(file, NULL)' sets file's timestamp to the present. */
|
|
||||||
#undef HAVE_UTIME_NULL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <utmpx.h> header file. */
|
|
||||||
#undef HAVE_UTMPX_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <utmp.h> header file. */
|
|
||||||
#undef HAVE_UTMP_H
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `_Bool'. */
|
|
||||||
#undef HAVE__BOOL
|
|
||||||
|
|
||||||
/* Path for lastlog file. */
|
|
||||||
#undef LASTLOG_FILE
|
|
||||||
|
|
||||||
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
|
||||||
#undef LT_OBJDIR
|
|
||||||
|
|
||||||
/* Location of system mail spool directory. */
|
|
||||||
#undef MAIL_SPOOL_DIR
|
|
||||||
|
|
||||||
/* Name of user's mail spool file if stored in user's home directory. */
|
|
||||||
#undef MAIL_SPOOL_FILE
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
|
|
||||||
/* Path to passwd program. */
|
|
||||||
#undef PASSWD_PROGRAM
|
|
||||||
|
|
||||||
/* Define as the return type of signal handlers (`int' or `void'). */
|
|
||||||
#undef RETSIGTYPE
|
|
||||||
|
|
||||||
/* Define if login should support the -r flag for rlogind. */
|
|
||||||
#undef RLOGIN
|
|
||||||
|
|
||||||
/* Define to the ruserok() "success" return value (0 or 1). */
|
|
||||||
#undef RUSEROK
|
|
||||||
|
|
||||||
/* Define to support the shadow group file. */
|
|
||||||
#undef SHADOWGRP
|
|
||||||
|
|
||||||
/* PAM conversation to use */
|
|
||||||
#undef SHADOW_PAM_CONVERSATION
|
|
||||||
|
|
||||||
/* The default shell. */
|
|
||||||
#undef SHELL
|
|
||||||
|
|
||||||
/* The size of `gid_t', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_GID_T
|
|
||||||
|
|
||||||
/* The size of `uid_t', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_UID_T
|
|
||||||
|
|
||||||
/* Define to support S/Key logins. */
|
|
||||||
#undef SKEY
|
|
||||||
|
|
||||||
/* Define to support newer BSD S/Key API */
|
|
||||||
#undef SKEY_BSD_STYLE
|
|
||||||
|
|
||||||
/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
|
|
||||||
#undef STAT_MACROS_BROKEN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#undef STDC_HEADERS
|
|
||||||
|
|
||||||
/* Define to support /etc/suauth su access control. */
|
|
||||||
#undef SU_ACCESS
|
|
||||||
|
|
||||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
|
||||||
#undef TIME_WITH_SYS_TIME
|
|
||||||
|
|
||||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
|
||||||
#undef TM_IN_SYS_TIME
|
|
||||||
|
|
||||||
/* Define to allow the bcrypt password encryption algorithm */
|
|
||||||
#undef USE_BCRYPT
|
|
||||||
|
|
||||||
/* Define to support flushing of nscd caches */
|
|
||||||
#undef USE_NSCD
|
|
||||||
|
|
||||||
/* Define to support Pluggable Authentication Modules */
|
|
||||||
#undef USE_PAM
|
|
||||||
|
|
||||||
/* Define to allow the SHA256 and SHA512 password encryption algorithms */
|
|
||||||
#undef USE_SHA_CRYPT
|
|
||||||
|
|
||||||
/* Define to support flushing of sssd caches */
|
|
||||||
#undef USE_SSSD
|
|
||||||
|
|
||||||
/* Define to use syslog(). */
|
|
||||||
#undef USE_SYSLOG
|
|
||||||
|
|
||||||
/* Enable extensions on AIX 3, Interix. */
|
|
||||||
#ifndef _ALL_SOURCE
|
|
||||||
# undef _ALL_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable GNU extensions on systems that have them. */
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
# undef _GNU_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable threading extensions on Solaris. */
|
|
||||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
|
||||||
# undef _POSIX_PTHREAD_SEMANTICS
|
|
||||||
#endif
|
|
||||||
/* Enable extensions on HP NonStop. */
|
|
||||||
#ifndef _TANDEM_SOURCE
|
|
||||||
# undef _TANDEM_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable general extensions on Solaris. */
|
|
||||||
#ifndef __EXTENSIONS__
|
|
||||||
# undef __EXTENSIONS__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Define if utmpx should be used */
|
|
||||||
#undef USE_UTMPX
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#undef VERSION
|
|
||||||
|
|
||||||
/* Build shadow with ACL support */
|
|
||||||
#undef WITH_ACL
|
|
||||||
|
|
||||||
/* Build shadow with Extended Attributes support */
|
|
||||||
#undef WITH_ATTR
|
|
||||||
|
|
||||||
/* Define if you want to enable Audit messages */
|
|
||||||
#undef WITH_AUDIT
|
|
||||||
|
|
||||||
/* Build shadow with BtrFS support */
|
|
||||||
#undef WITH_BTRFS
|
|
||||||
|
|
||||||
/* Build shadow with SELinux support */
|
|
||||||
#undef WITH_SELINUX
|
|
||||||
|
|
||||||
/* Build with su */
|
|
||||||
#undef WITH_SU
|
|
||||||
|
|
||||||
/* Build shadow with tcb support (incomplete) */
|
|
||||||
#undef WITH_TCB
|
|
||||||
|
|
||||||
/* Enable large inode numbers on Mac OS X 10.5. */
|
|
||||||
#ifndef _DARWIN_USE_64_BIT_INODE
|
|
||||||
# define _DARWIN_USE_64_BIT_INODE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
|
||||||
#undef _FILE_OFFSET_BITS
|
|
||||||
|
|
||||||
/* Define for large files, on AIX-style hosts. */
|
|
||||||
#undef _LARGE_FILES
|
|
||||||
|
|
||||||
/* Define to 1 if on MINIX. */
|
|
||||||
#undef _MINIX
|
|
||||||
|
|
||||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
|
||||||
this defined. */
|
|
||||||
#undef _POSIX_1_SOURCE
|
|
||||||
|
|
||||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
|
||||||
#undef _POSIX_SOURCE
|
|
||||||
|
|
||||||
/* Path for utmp file. */
|
|
||||||
#undef _UTMP_FILE
|
|
||||||
|
|
||||||
/* Path for wtmp file. */
|
|
||||||
#undef _WTMP_FILE
|
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
|
||||||
#undef const
|
|
||||||
|
|
||||||
/* Define to `int' if <sys/types.h> doesn't define. */
|
|
||||||
#undef gid_t
|
|
||||||
|
|
||||||
/* Define to `int' if <sys/types.h> does not define. */
|
|
||||||
#undef mode_t
|
|
||||||
|
|
||||||
/* Define to `long int' if <sys/types.h> does not define. */
|
|
||||||
#undef off_t
|
|
||||||
|
|
||||||
/* Define to `int' if <sys/types.h> does not define. */
|
|
||||||
#undef pid_t
|
|
||||||
|
|
||||||
/* Define to `int' if <sys/types.h> doesn't define. */
|
|
||||||
#undef uid_t
|
|
||||||
-614
@@ -1,614 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Output a system dependent set of variables, describing how to set the
|
|
||||||
# run time search path of shared libraries in an executable.
|
|
||||||
#
|
|
||||||
# Copyright 1996-2006 Free Software Foundation, Inc.
|
|
||||||
# Taken from GNU libtool, 2001
|
|
||||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 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.
|
|
||||||
#
|
|
||||||
# The first argument passed to this file is the canonical host specification,
|
|
||||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
|
||||||
# or
|
|
||||||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
|
||||||
# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
|
|
||||||
# should be set by the caller.
|
|
||||||
#
|
|
||||||
# The set of defined variables is at the end of this script.
|
|
||||||
|
|
||||||
# Known limitations:
|
|
||||||
# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
|
|
||||||
# than 256 bytes, otherwise the compiler driver will dump core. The only
|
|
||||||
# known workaround is to choose shorter directory names for the build
|
|
||||||
# directory and/or the installation directory.
|
|
||||||
|
|
||||||
# All known linkers require a `.a' archive for static linking (except MSVC,
|
|
||||||
# which needs '.lib').
|
|
||||||
libext=a
|
|
||||||
shrext=.so
|
|
||||||
|
|
||||||
host="$1"
|
|
||||||
host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
|
|
||||||
host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
|
|
||||||
host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
|
||||||
|
|
||||||
# Code taken from libtool.m4's _LT_CC_BASENAME.
|
|
||||||
|
|
||||||
for cc_temp in $CC""; do
|
|
||||||
case $cc_temp in
|
|
||||||
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
|
|
||||||
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
|
|
||||||
\-*) ;;
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
|
|
||||||
|
|
||||||
# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
|
|
||||||
|
|
||||||
wl=
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
wl='-Wl,'
|
|
||||||
else
|
|
||||||
case "$host_os" in
|
|
||||||
aix*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
darwin*)
|
|
||||||
case $cc_basename in
|
|
||||||
xlc*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
mingw* | pw32* | os2*)
|
|
||||||
;;
|
|
||||||
hpux9* | hpux10* | hpux11*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
irix5* | irix6* | nonstopux*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
newsos6)
|
|
||||||
;;
|
|
||||||
linux*)
|
|
||||||
case $cc_basename in
|
|
||||||
icc* | ecc*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
pgcc | pgf77 | pgf90)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
ccc*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
como)
|
|
||||||
wl='-lopt='
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
case `$CC -V 2>&1 | sed 5q` in
|
|
||||||
*Sun\ C*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
osf3* | osf4* | osf5*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
sco3.2v5*)
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
sunos4*)
|
|
||||||
wl='-Qoption ld '
|
|
||||||
;;
|
|
||||||
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
sysv4*MP*)
|
|
||||||
;;
|
|
||||||
unicos*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
uts4*)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
|
|
||||||
|
|
||||||
hardcode_libdir_flag_spec=
|
|
||||||
hardcode_libdir_separator=
|
|
||||||
hardcode_direct=no
|
|
||||||
hardcode_minus_L=no
|
|
||||||
|
|
||||||
case "$host_os" in
|
|
||||||
cygwin* | mingw* | pw32*)
|
|
||||||
# FIXME: the MSVC++ port hasn't been tested in a loooong time
|
|
||||||
# When not using gcc, we currently assume that we are using
|
|
||||||
# Microsoft Visual C++.
|
|
||||||
if test "$GCC" != yes; then
|
|
||||||
with_gnu_ld=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
interix*)
|
|
||||||
# we just hope/assume this is gcc and not c89 (= MSVC++)
|
|
||||||
with_gnu_ld=yes
|
|
||||||
;;
|
|
||||||
openbsd*)
|
|
||||||
with_gnu_ld=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ld_shlibs=yes
|
|
||||||
if test "$with_gnu_ld" = yes; then
|
|
||||||
# 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.
|
|
||||||
# Unlike libtool, we use -rpath here, not --rpath, since the documented
|
|
||||||
# option of GNU ld is called -rpath, not --rpath.
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
case "$host_os" in
|
|
||||||
aix3* | aix4* | aix5*)
|
|
||||||
# On AIX/PPC, the GNU linker is very broken
|
|
||||||
if test "$host_cpu" != ia64; then
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
amigaos*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
# Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
|
|
||||||
# that the semantics of dynamic libraries on AmigaOS, at least up
|
|
||||||
# to version 4, is to share data among multiple programs linked
|
|
||||||
# with the same dynamic library. Since this doesn't match the
|
|
||||||
# behavior of shared libraries on other platforms, we cannot use
|
|
||||||
# them.
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
beos*)
|
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
cygwin* | mingw* | pw32*)
|
|
||||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
|
||||||
# no search path for DLLs.
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
interix3*)
|
|
||||||
hardcode_direct=no
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
|
||||||
;;
|
|
||||||
linux*)
|
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
netbsd*)
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
|
|
||||||
ld_shlibs=no
|
|
||||||
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
:
|
|
||||||
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
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
sunos4*)
|
|
||||||
hardcode_direct=yes
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if test "$ld_shlibs" = no; then
|
|
||||||
hardcode_libdir_flag_spec=
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
case "$host_os" in
|
|
||||||
aix3*)
|
|
||||||
# Note: this linker hardcodes the directories in LIBPATH if there
|
|
||||||
# are no directories specified by -L.
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
# Neither direct hardcoding nor static linking is supported with a
|
|
||||||
# broken collect2.
|
|
||||||
hardcode_direct=unsupported
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
aix4* | aix5*)
|
|
||||||
if test "$host_cpu" = ia64; then
|
|
||||||
# On IA64, the linker does run time linking by default, so we don't
|
|
||||||
# have to do anything special.
|
|
||||||
aix_use_runtimelinking=no
|
|
||||||
else
|
|
||||||
aix_use_runtimelinking=no
|
|
||||||
# Test if we are trying to use run time linking or normal
|
|
||||||
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
|
||||||
# need to do runtime linking.
|
|
||||||
case $host_os in aix4.[23]|aix4.[23].*|aix5*)
|
|
||||||
for ld_flag in $LDFLAGS; do
|
|
||||||
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
|
||||||
aix_use_runtimelinking=yes
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
hardcode_direct=yes
|
|
||||||
hardcode_libdir_separator=':'
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
case $host_os in aix4.[012]|aix4.[012].*)
|
|
||||||
collect2name=`${CC} -print-prog-name=collect2`
|
|
||||||
if test -f "$collect2name" && \
|
|
||||||
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
|
||||||
then
|
|
||||||
# We have reworked collect2
|
|
||||||
hardcode_direct=yes
|
|
||||||
else
|
|
||||||
# We have old collect2
|
|
||||||
hardcode_direct=unsupported
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_libdir_separator=
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
# Begin _LT_AC_SYS_LIBPATH_AIX.
|
|
||||||
echo 'int main () { return 0; }' > conftest.c
|
|
||||||
${CC} ${LDFLAGS} conftest.c -o conftest
|
|
||||||
aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
|
||||||
}'`
|
|
||||||
if test -z "$aix_libpath"; then
|
|
||||||
aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
|
||||||
}'`
|
|
||||||
fi
|
|
||||||
if test -z "$aix_libpath"; then
|
|
||||||
aix_libpath="/usr/lib:/lib"
|
|
||||||
fi
|
|
||||||
rm -f conftest.c conftest
|
|
||||||
# End _LT_AC_SYS_LIBPATH_AIX.
|
|
||||||
if test "$aix_use_runtimelinking" = yes; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
|
||||||
else
|
|
||||||
if test "$host_cpu" = ia64; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
|
|
||||||
else
|
|
||||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
amigaos*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
# see comment about different semantics on the GNU ld section
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
bsdi[45]*)
|
|
||||||
;;
|
|
||||||
cygwin* | mingw* | pw32*)
|
|
||||||
# When not using gcc, we currently assume that we are using
|
|
||||||
# Microsoft Visual C++.
|
|
||||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
|
||||||
# no search path for DLLs.
|
|
||||||
hardcode_libdir_flag_spec=' '
|
|
||||||
libext=lib
|
|
||||||
;;
|
|
||||||
darwin* | rhapsody*)
|
|
||||||
hardcode_direct=no
|
|
||||||
if test "$GCC" = yes ; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
case $cc_basename in
|
|
||||||
xlc*)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
dgux*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
;;
|
|
||||||
freebsd1*)
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
freebsd2.2*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
hardcode_direct=yes
|
|
||||||
;;
|
|
||||||
freebsd2*)
|
|
||||||
hardcode_direct=yes
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
freebsd* | kfreebsd*-gnu | dragonfly*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
hardcode_direct=yes
|
|
||||||
;;
|
|
||||||
hpux9*)
|
|
||||||
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
|
|
||||||
;;
|
|
||||||
hpux10*)
|
|
||||||
if test "$with_gnu_ld" = no; then
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
hpux11*)
|
|
||||||
if test "$with_gnu_ld" = no; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
case $host_cpu in
|
|
||||||
hppa*64*|ia64*)
|
|
||||||
hardcode_direct=no
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
hardcode_direct=yes
|
|
||||||
# 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*)
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
;;
|
|
||||||
netbsd*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
hardcode_direct=yes
|
|
||||||
;;
|
|
||||||
newsos6)
|
|
||||||
hardcode_direct=yes
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
;;
|
|
||||||
openbsd*)
|
|
||||||
hardcode_direct=yes
|
|
||||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
|
||||||
else
|
|
||||||
case "$host_os" in
|
|
||||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
os2*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
osf3*)
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
;;
|
|
||||||
osf4* | osf5*)
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
else
|
|
||||||
# Both cc and cxx compiler support -rpath directly
|
|
||||||
hardcode_libdir_flag_spec='-rpath $libdir'
|
|
||||||
fi
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
;;
|
|
||||||
sunos4*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_direct=yes
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
sysv4)
|
|
||||||
case $host_vendor in
|
|
||||||
sni)
|
|
||||||
hardcode_direct=yes # is this really true???
|
|
||||||
;;
|
|
||||||
siemens)
|
|
||||||
hardcode_direct=no
|
|
||||||
;;
|
|
||||||
motorola)
|
|
||||||
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
sysv4.3*)
|
|
||||||
;;
|
|
||||||
sysv4*MP*)
|
|
||||||
if test -d /usr/nec; then
|
|
||||||
ld_shlibs=yes
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
|
|
||||||
;;
|
|
||||||
sysv5* | sco3.2v5* | sco5v6*)
|
|
||||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
|
||||||
hardcode_libdir_separator=':'
|
|
||||||
;;
|
|
||||||
uts4*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check dynamic linker characteristics
|
|
||||||
# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
|
|
||||||
libname_spec='lib$name'
|
|
||||||
case "$host_os" in
|
|
||||||
aix3*)
|
|
||||||
;;
|
|
||||||
aix4* | aix5*)
|
|
||||||
;;
|
|
||||||
amigaos*)
|
|
||||||
;;
|
|
||||||
beos*)
|
|
||||||
;;
|
|
||||||
bsdi[45]*)
|
|
||||||
;;
|
|
||||||
cygwin* | mingw* | pw32*)
|
|
||||||
shrext=.dll
|
|
||||||
;;
|
|
||||||
darwin* | rhapsody*)
|
|
||||||
shrext=.dylib
|
|
||||||
;;
|
|
||||||
dgux*)
|
|
||||||
;;
|
|
||||||
freebsd1*)
|
|
||||||
;;
|
|
||||||
kfreebsd*-gnu)
|
|
||||||
;;
|
|
||||||
freebsd* | dragonfly*)
|
|
||||||
;;
|
|
||||||
gnu*)
|
|
||||||
;;
|
|
||||||
hpux9* | hpux10* | hpux11*)
|
|
||||||
case $host_cpu in
|
|
||||||
ia64*)
|
|
||||||
shrext=.so
|
|
||||||
;;
|
|
||||||
hppa*64*)
|
|
||||||
shrext=.sl
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
shrext=.sl
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
interix3*)
|
|
||||||
;;
|
|
||||||
irix5* | irix6* | nonstopux*)
|
|
||||||
case "$host_os" in
|
|
||||||
irix5* | nonstopux*)
|
|
||||||
libsuff= shlibsuff=
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
case $LD in
|
|
||||||
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
|
|
||||||
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
|
|
||||||
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
|
|
||||||
*) libsuff= shlibsuff= ;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
linux*oldld* | linux*aout* | linux*coff*)
|
|
||||||
;;
|
|
||||||
linux*)
|
|
||||||
;;
|
|
||||||
knetbsd*-gnu)
|
|
||||||
;;
|
|
||||||
netbsd*)
|
|
||||||
;;
|
|
||||||
newsos6)
|
|
||||||
;;
|
|
||||||
nto-qnx*)
|
|
||||||
;;
|
|
||||||
openbsd*)
|
|
||||||
;;
|
|
||||||
os2*)
|
|
||||||
libname_spec='$name'
|
|
||||||
shrext=.dll
|
|
||||||
;;
|
|
||||||
osf3* | osf4* | osf5*)
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
;;
|
|
||||||
sunos4*)
|
|
||||||
;;
|
|
||||||
sysv4 | sysv4.3*)
|
|
||||||
;;
|
|
||||||
sysv4*MP*)
|
|
||||||
;;
|
|
||||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
|
||||||
;;
|
|
||||||
uts4*)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
|
||||||
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
|
||||||
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
|
||||||
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
|
||||||
|
|
||||||
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
|
||||||
|
|
||||||
# How to pass a linker flag through the compiler.
|
|
||||||
wl="$escaped_wl"
|
|
||||||
|
|
||||||
# Static library suffix (normally "a").
|
|
||||||
libext="$libext"
|
|
||||||
|
|
||||||
# Shared library suffix (normally "so").
|
|
||||||
shlibext="$shlibext"
|
|
||||||
|
|
||||||
# Flag to hardcode \$libdir into a binary during linking.
|
|
||||||
# This must work even if \$libdir does not exist.
|
|
||||||
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
|
||||||
|
|
||||||
# Whether we need a single -rpath flag with a separated argument.
|
|
||||||
hardcode_libdir_separator="$hardcode_libdir_separator"
|
|
||||||
|
|
||||||
# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
|
|
||||||
# resulting binary.
|
|
||||||
hardcode_direct="$hardcode_direct"
|
|
||||||
|
|
||||||
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
|
|
||||||
# resulting binary.
|
|
||||||
hardcode_minus_L="$hardcode_minus_L"
|
|
||||||
|
|
||||||
EOF
|
|
||||||
Vendored
-1801
File diff suppressed because it is too large
Load Diff
-749
@@ -1,749 +0,0 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script.
|
|
||||||
AC_PREREQ([2.64])
|
|
||||||
AC_INIT([shadow], [4.8], [pkg-shadow-devel@lists.alioth.debian.org], [],
|
|
||||||
[https://github.com/shadow-maint/shadow])
|
|
||||||
AM_INIT_AUTOMAKE([1.11 foreign dist-xz])
|
|
||||||
AM_SILENT_RULES([yes])
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
|
||||||
|
|
||||||
dnl Some hacks...
|
|
||||||
test "$prefix" = "NONE" && prefix="/usr"
|
|
||||||
test "$prefix" = "/usr" && exec_prefix=""
|
|
||||||
|
|
||||||
AC_GNU_SOURCE
|
|
||||||
|
|
||||||
AM_DISABLE_SHARED
|
|
||||||
AM_ENABLE_STATIC
|
|
||||||
|
|
||||||
AM_MAINTAINER_MODE
|
|
||||||
|
|
||||||
dnl Checks for programs.
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_ISC_POSIX
|
|
||||||
AC_PROG_LN_S
|
|
||||||
AC_PROG_YACC
|
|
||||||
AM_PROG_LIBTOOL
|
|
||||||
|
|
||||||
dnl Checks for libraries.
|
|
||||||
|
|
||||||
dnl Checks for header files.
|
|
||||||
AC_HEADER_DIRENT
|
|
||||||
AC_HEADER_STDC
|
|
||||||
AC_HEADER_SYS_WAIT
|
|
||||||
AC_HEADER_STDBOOL
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(errno.h fcntl.h limits.h unistd.h sys/time.h utmp.h \
|
|
||||||
utmpx.h termios.h termio.h sgtty.h sys/ioctl.h syslog.h paths.h \
|
|
||||||
utime.h ulimit.h sys/capability.h sys/resource.h gshadow.h lastlog.h \
|
|
||||||
locale.h rpc/key_prot.h netdb.h acl/libacl.h attr/libattr.h \
|
|
||||||
attr/error_context.h)
|
|
||||||
|
|
||||||
dnl shadow now uses the libc's shadow implementation
|
|
||||||
AC_CHECK_HEADER([shadow.h],,[AC_MSG_ERROR([You need a libc with shadow.h])])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS(l64a fchmod fchown fsync futimes getgroups gethostname getspnam \
|
|
||||||
gettimeofday getusershell getutent initgroups lchown lckpwdf lstat \
|
|
||||||
lutimes memcpy memset setgroups sigaction strchr updwtmp updwtmpx innetgr \
|
|
||||||
getpwnam_r getpwuid_r getgrnam_r getgrgid_r getspnam_r getaddrinfo \
|
|
||||||
ruserok)
|
|
||||||
AC_SYS_LARGEFILE
|
|
||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
|
||||||
AC_C_CONST
|
|
||||||
AC_TYPE_UID_T
|
|
||||||
AC_TYPE_OFF_T
|
|
||||||
AC_TYPE_PID_T
|
|
||||||
AC_TYPE_MODE_T
|
|
||||||
AC_HEADER_STAT
|
|
||||||
AC_CHECK_MEMBERS([struct stat.st_rdev])
|
|
||||||
AC_CHECK_MEMBERS([struct stat.st_atim])
|
|
||||||
AC_CHECK_MEMBERS([struct stat.st_atimensec])
|
|
||||||
AC_CHECK_MEMBERS([struct stat.st_mtim])
|
|
||||||
AC_CHECK_MEMBERS([struct stat.st_mtimensec])
|
|
||||||
AC_HEADER_TIME
|
|
||||||
AC_STRUCT_TM
|
|
||||||
|
|
||||||
AC_CHECK_MEMBERS([struct utmp.ut_type,
|
|
||||||
struct utmp.ut_id,
|
|
||||||
struct utmp.ut_name,
|
|
||||||
struct utmp.ut_user,
|
|
||||||
struct utmp.ut_host,
|
|
||||||
struct utmp.ut_syslen,
|
|
||||||
struct utmp.ut_addr,
|
|
||||||
struct utmp.ut_addr_v6,
|
|
||||||
struct utmp.ut_time,
|
|
||||||
struct utmp.ut_xtime,
|
|
||||||
struct utmp.ut_tv],,,[[#include <utmp.h>]])
|
|
||||||
|
|
||||||
AC_CHECK_MEMBERS([struct utmpx.ut_name,
|
|
||||||
struct utmpx.ut_host,
|
|
||||||
struct utmpx.ut_syslen,
|
|
||||||
struct utmpx.ut_addr,
|
|
||||||
struct utmpx.ut_addr_v6,
|
|
||||||
struct utmpx.ut_time,
|
|
||||||
struct utmpx.ut_xtime],,,[[#include <utmpx.h>]])
|
|
||||||
|
|
||||||
if test "$ac_cv_header_lastlog_h" = "yes"; then
|
|
||||||
AC_CACHE_CHECK(for ll_host in struct lastlog,
|
|
||||||
ac_cv_struct_lastlog_ll_host,
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <lastlog.h>],
|
|
||||||
[struct lastlog ll; char *cp = ll.ll_host;]
|
|
||||||
)],
|
|
||||||
[ac_cv_struct_lastlog_ll_host=yes],
|
|
||||||
[ac_cv_struct_lastlog_ll_host=no]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if test "$ac_cv_struct_lastlog_ll_host" = "yes"; then
|
|
||||||
AC_DEFINE(HAVE_LL_HOST, 1,
|
|
||||||
[Define if struct lastlog has ll_host])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Checks for library functions.
|
|
||||||
AC_TYPE_GETGROUPS
|
|
||||||
AC_TYPE_SIGNAL
|
|
||||||
AC_FUNC_UTIME_NULL
|
|
||||||
AC_FUNC_STRFTIME
|
|
||||||
AC_REPLACE_FUNCS(mkdir putgrent putpwent putspent rename rmdir)
|
|
||||||
AC_REPLACE_FUNCS(sgetgrent sgetpwent sgetspent)
|
|
||||||
AC_REPLACE_FUNCS(snprintf strcasecmp strdup strerror strstr)
|
|
||||||
|
|
||||||
AC_CHECK_FUNC(setpgrp)
|
|
||||||
AC_CHECK_FUNC(secure_getenv, [AC_DEFINE(HAS_SECURE_GETENV,
|
|
||||||
1,
|
|
||||||
[Defined to 1 if you have the declaration of 'secure_getenv'])])
|
|
||||||
|
|
||||||
if test "$ac_cv_header_shadow_h" = "yes"; then
|
|
||||||
AC_CACHE_CHECK(for working shadow group support,
|
|
||||||
ac_cv_libc_shadowgrp,
|
|
||||||
AC_RUN_IFELSE([AC_LANG_SOURCE([
|
|
||||||
#include <shadow.h>
|
|
||||||
main()
|
|
||||||
{
|
|
||||||
struct sgrp *sg = sgetsgent("test:x::");
|
|
||||||
/* NYS libc on Red Hat 3.0.3 has broken shadow group support */
|
|
||||||
return !sg || !sg->sg_adm || !sg->sg_mem;
|
|
||||||
}]
|
|
||||||
)],
|
|
||||||
[ac_cv_libc_shadowgrp=yes],
|
|
||||||
[ac_cv_libc_shadowgrp=no],
|
|
||||||
[ac_cv_libc_shadowgrp=no]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if test "$ac_cv_libc_shadowgrp" = "yes"; then
|
|
||||||
AC_DEFINE(HAVE_SHADOWGRP, 1, [Have working shadow group support in libc])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([location of shared mail directory], shadow_cv_maildir,
|
|
||||||
[for shadow_cv_maildir in /var/mail /var/spool/mail /usr/spool/mail /usr/mail none; do
|
|
||||||
if test -d $shadow_cv_maildir; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done])
|
|
||||||
if test $shadow_cv_maildir != none; then
|
|
||||||
AC_DEFINE_UNQUOTED(MAIL_SPOOL_DIR, "$shadow_cv_maildir",
|
|
||||||
[Location of system mail spool directory.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([location of user mail file], shadow_cv_mailfile,
|
|
||||||
[for shadow_cv_mailfile in Mailbox mailbox Mail mail .mail none; do
|
|
||||||
if test -f $HOME/$shadow_cv_mailfile; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done])
|
|
||||||
if test $shadow_cv_mailfile != none; then
|
|
||||||
AC_DEFINE_UNQUOTED(MAIL_SPOOL_FILE, "$shadow_cv_mailfile",
|
|
||||||
[Name of user's mail spool file if stored in user's home directory.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([location of utmp], shadow_cv_utmpdir,
|
|
||||||
[for shadow_cv_utmpdir in /var/run /var/adm /usr/adm /etc none; do
|
|
||||||
if test -f $shadow_cv_utmpdir/utmp; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done])
|
|
||||||
if test "$shadow_cv_utmpdir" = "none"; then
|
|
||||||
AC_MSG_WARN(utmp file not found)
|
|
||||||
fi
|
|
||||||
AC_DEFINE_UNQUOTED(_UTMP_FILE, "$shadow_cv_utmpdir/utmp",
|
|
||||||
[Path for utmp file.])
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([location of faillog/lastlog/wtmp], shadow_cv_logdir,
|
|
||||||
[for shadow_cv_logdir in /var/log /var/adm /usr/adm /etc; do
|
|
||||||
if test -d $shadow_cv_logdir; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done])
|
|
||||||
AC_DEFINE_UNQUOTED(_WTMP_FILE, "$shadow_cv_logdir/wtmp",
|
|
||||||
[Path for wtmp file.])
|
|
||||||
AC_DEFINE_UNQUOTED(LASTLOG_FILE, "$shadow_cv_logdir/lastlog",
|
|
||||||
[Path for lastlog file.])
|
|
||||||
AC_DEFINE_UNQUOTED(FAILLOG_FILE, "$shadow_cv_logdir/faillog",
|
|
||||||
[Path for faillog file.])
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([location of the passwd program], shadow_cv_passwd_dir,
|
|
||||||
[if test -f /usr/bin/passwd; then
|
|
||||||
shadow_cv_passwd_dir=/usr/bin
|
|
||||||
else
|
|
||||||
shadow_cv_passwd_dir=/bin
|
|
||||||
fi])
|
|
||||||
AC_DEFINE_UNQUOTED(PASSWD_PROGRAM, "$shadow_cv_passwd_dir/passwd",
|
|
||||||
[Path to passwd program.])
|
|
||||||
|
|
||||||
dnl XXX - quick hack, should disappear before anyone notices :).
|
|
||||||
AC_DEFINE(USE_SYSLOG, 1, [Define to use syslog().])
|
|
||||||
if test "$ac_cv_func_ruserok" = "yes"; then
|
|
||||||
AC_DEFINE(RLOGIN, 1, [Define if login should support the -r flag for rlogind.])
|
|
||||||
AC_DEFINE(RUSEROK, 0, [Define to the ruserok() "success" return value (0 or 1).])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(shadowgrp,
|
|
||||||
[AC_HELP_STRING([--enable-shadowgrp], [enable shadow group support @<:@default=yes@:>@])],
|
|
||||||
[case "${enableval}" in
|
|
||||||
yes) enable_shadowgrp="yes" ;;
|
|
||||||
no) enable_shadowgrp="no" ;;
|
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-shadowgrp) ;;
|
|
||||||
esac],
|
|
||||||
[enable_shadowgrp="yes"]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(man,
|
|
||||||
[AC_HELP_STRING([--enable-man],
|
|
||||||
[regenerate roff man pages from Docbook @<:@default=no@:>@])],
|
|
||||||
[enable_man="${enableval}"],
|
|
||||||
[enable_man="no"]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(account-tools-setuid,
|
|
||||||
[AC_HELP_STRING([--enable-account-tools-setuid],
|
|
||||||
[Install the user and group management tools setuid and authenticate the callers. This requires --with-pam.])],
|
|
||||||
[case "${enableval}" in
|
|
||||||
yes) enable_acct_tools_setuid="yes" ;;
|
|
||||||
no) enable_acct_tools_setuid="no" ;;
|
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-account-tools-setuid)
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_acct_tools_setuid="maybe"]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(utmpx,
|
|
||||||
[AC_HELP_STRING([--enable-utmpx],
|
|
||||||
[enable loggin in utmpx / wtmpx @<:@default=no@:>@])],
|
|
||||||
[case "${enableval}" in
|
|
||||||
yes) enable_utmpx="yes" ;;
|
|
||||||
no) enable_utmpx="no" ;;
|
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-utmpx) ;;
|
|
||||||
esac],
|
|
||||||
[enable_utmpx="no"]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(subordinate-ids,
|
|
||||||
[AC_HELP_STRING([--enable-subordinate-ids],
|
|
||||||
[support subordinate ids @<:@default=yes@:>@])],
|
|
||||||
[enable_subids="${enableval}"],
|
|
||||||
[enable_subids="maybe"]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_ARG_WITH(audit,
|
|
||||||
[AC_HELP_STRING([--with-audit], [use auditing support @<:@default=yes if found@:>@])],
|
|
||||||
[with_audit=$withval], [with_audit=maybe])
|
|
||||||
AC_ARG_WITH(libpam,
|
|
||||||
[AC_HELP_STRING([--with-libpam], [use libpam for PAM support @<:@default=yes if found@:>@])],
|
|
||||||
[with_libpam=$withval], [with_libpam=maybe])
|
|
||||||
AC_ARG_WITH(btrfs,
|
|
||||||
[AC_HELP_STRING([--with-btrfs], [add BtrFS support @<:@default=yes if found@:>@])],
|
|
||||||
[with_btrfs=$withval], [with_btrfs=maybe])
|
|
||||||
AC_ARG_WITH(selinux,
|
|
||||||
[AC_HELP_STRING([--with-selinux], [use SELinux support @<:@default=yes if found@:>@])],
|
|
||||||
[with_selinux=$withval], [with_selinux=maybe])
|
|
||||||
AC_ARG_WITH(acl,
|
|
||||||
[AC_HELP_STRING([--with-acl], [use ACL support @<:@default=yes if found@:>@])],
|
|
||||||
[with_acl=$withval], [with_acl=maybe])
|
|
||||||
AC_ARG_WITH(attr,
|
|
||||||
[AC_HELP_STRING([--with-attr], [use Extended Attribute support @<:@default=yes if found@:>@])],
|
|
||||||
[with_attr=$withval], [with_attr=maybe])
|
|
||||||
AC_ARG_WITH(skey,
|
|
||||||
[AC_HELP_STRING([--with-skey], [use S/Key support @<:@default=no@:>@])],
|
|
||||||
[with_skey=$withval], [with_skey=no])
|
|
||||||
AC_ARG_WITH(tcb,
|
|
||||||
[AC_HELP_STRING([--with-tcb], [use tcb support (incomplete) @<:@default=yes if found@:>@])],
|
|
||||||
[with_tcb=$withval], [with_tcb=maybe])
|
|
||||||
AC_ARG_WITH(libcrack,
|
|
||||||
[AC_HELP_STRING([--with-libcrack], [use libcrack @<:@default=no@:>@])],
|
|
||||||
[with_libcrack=$withval], [with_libcrack=no])
|
|
||||||
AC_ARG_WITH(sha-crypt,
|
|
||||||
[AC_HELP_STRING([--with-sha-crypt], [allow the SHA256 and SHA512 password encryption algorithms @<:@default=yes@:>@])],
|
|
||||||
[with_sha_crypt=$withval], [with_sha_crypt=yes])
|
|
||||||
AC_ARG_WITH(bcrypt,
|
|
||||||
[AC_HELP_STRING([--with-bcrypt], [allow the bcrypt password encryption algorithm @<:@default=no@:>@])],
|
|
||||||
[with_bcrypt=$withval], [with_bcrypt=no])
|
|
||||||
AC_ARG_WITH(nscd,
|
|
||||||
[AC_HELP_STRING([--with-nscd], [enable support for nscd @<:@default=yes@:>@])],
|
|
||||||
[with_nscd=$withval], [with_nscd=yes])
|
|
||||||
AC_ARG_WITH(sssd,
|
|
||||||
[AC_HELP_STRING([--with-sssd], [enable support for flushing sssd caches @<:@default=yes@:>@])],
|
|
||||||
[with_sssd=$withval], [with_sssd=yes])
|
|
||||||
AC_ARG_WITH(group-name-max-length,
|
|
||||||
[AC_HELP_STRING([--with-group-name-max-length], [set max group name length @<:@default=16@:>@])],
|
|
||||||
[with_group_name_max_length=$withval], [with_group_name_max_length=yes])
|
|
||||||
AC_ARG_WITH(su,
|
|
||||||
[AC_HELP_STRING([--with-su], [build and install su program and man page @<:@default=yes@:>@])],
|
|
||||||
[with_su=$withval], [with_su=yes])
|
|
||||||
|
|
||||||
if test "$with_group_name_max_length" = "no" ; then
|
|
||||||
with_group_name_max_length=0
|
|
||||||
elif test "$with_group_name_max_length" = "yes" ; then
|
|
||||||
with_group_name_max_length=16
|
|
||||||
fi
|
|
||||||
AC_DEFINE_UNQUOTED(GROUP_NAME_MAX_LENGTH, $with_group_name_max_length, [max group name length])
|
|
||||||
AC_SUBST(GROUP_NAME_MAX_LENGTH)
|
|
||||||
GROUP_NAME_MAX_LENGTH="$with_group_name_max_length"
|
|
||||||
|
|
||||||
AM_CONDITIONAL(USE_SHA_CRYPT, test "x$with_sha_crypt" = "xyes")
|
|
||||||
if test "$with_sha_crypt" = "yes"; then
|
|
||||||
AC_DEFINE(USE_SHA_CRYPT, 1, [Define to allow the SHA256 and SHA512 password encryption algorithms])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL(USE_BCRYPT, test "x$with_bcrypt" = "xyes")
|
|
||||||
if test "$with_bcrypt" = "yes"; then
|
|
||||||
AC_DEFINE(USE_BCRYPT, 1, [Define to allow the bcrypt password encryption algorithm])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$with_nscd" = "yes"; then
|
|
||||||
AC_CHECK_FUNC(posix_spawn,
|
|
||||||
[AC_DEFINE(USE_NSCD, 1, [Define to support flushing of nscd caches])],
|
|
||||||
[AC_MSG_ERROR([posix_spawn is needed for nscd support])])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$with_sssd" = "yes"; then
|
|
||||||
AC_CHECK_FUNC(posix_spawn,
|
|
||||||
[AC_DEFINE(USE_SSSD, 1, [Define to support flushing of sssd caches])],
|
|
||||||
[AC_MSG_ERROR([posix_spawn is needed for sssd support])])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AS_IF([test "$with_su" != "no"], AC_DEFINE(WITH_SU, 1, [Build with su])])
|
|
||||||
AM_CONDITIONAL([WITH_SU], [test "x$with_su" != "xno"])
|
|
||||||
|
|
||||||
dnl Check for some functions in libc first, only if not found check for
|
|
||||||
dnl other libraries. This should prevent linking libnsl if not really
|
|
||||||
dnl needed (Linux glibc, Irix), but still link it if needed (Solaris).
|
|
||||||
|
|
||||||
AC_SEARCH_LIBS(inet_ntoa, inet)
|
|
||||||
AC_SEARCH_LIBS(socket, socket)
|
|
||||||
AC_SEARCH_LIBS(gethostbyname, nsl)
|
|
||||||
|
|
||||||
AC_CHECK_LIB([econf],[econf_readDirs],[LIBECONF="-leconf"],[LIBECONF=""])
|
|
||||||
if test -n "$LIBECONF"; then
|
|
||||||
ECONF_CPPFLAGS="-DUSE_ECONF=1"
|
|
||||||
AC_ARG_ENABLE([vendordir],
|
|
||||||
AS_HELP_STRING([--enable-vendordir=DIR], [Directory for distribution provided configuration files]),,[])
|
|
||||||
fi
|
|
||||||
AC_SUBST(ECONF_CPPFLAGS)
|
|
||||||
AC_SUBST(LIBECONF)
|
|
||||||
AC_SUBST([VENDORDIR], [$enable_vendordir])
|
|
||||||
AM_CONDITIONAL([HAVE_VENDORDIR], [test "x$enable_vendordir" != x])
|
|
||||||
|
|
||||||
if test "$enable_shadowgrp" = "yes"; then
|
|
||||||
AC_DEFINE(SHADOWGRP, 1, [Define to support the shadow group file.])
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(SHADOWGRP, test "x$enable_shadowgrp" = "xyes")
|
|
||||||
|
|
||||||
if test "$enable_man" = "yes"; then
|
|
||||||
dnl
|
|
||||||
dnl Check for xsltproc
|
|
||||||
dnl
|
|
||||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
|
||||||
if test -z "$XSLTPROC"; then
|
|
||||||
enable_man=no
|
|
||||||
AC_MSG_ERROR([xsltproc is missing.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl check for DocBook DTD and stylesheets in the local catalog.
|
|
||||||
JH_CHECK_XML_CATALOG([-//OASIS//DTD DocBook XML V4.5//EN],
|
|
||||||
[DocBook XML DTD V4.5], [], enable_man=no)
|
|
||||||
JH_CHECK_XML_CATALOG([http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl],
|
|
||||||
[DocBook XSL Stylesheets >= 1.70.1], [], enable_man=no)
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(ENABLE_REGENERATE_MAN, test "x$enable_man" != "xno")
|
|
||||||
|
|
||||||
if test "$enable_subids" != "no"; then
|
|
||||||
dnl
|
|
||||||
dnl FIXME: check if 32 bit UIDs/GIDs are supported by libc
|
|
||||||
dnl
|
|
||||||
AC_CHECK_SIZEOF([uid_t],, [#include "sys/types.h"])
|
|
||||||
AC_CHECK_SIZEOF([gid_t],, [#include "sys/types.h"])
|
|
||||||
|
|
||||||
if test "$ac_cv_sizeof_uid_t" -ge 4 && test "$ac_cv_sizeof_gid_t" -ge 4; then
|
|
||||||
AC_DEFINE(ENABLE_SUBIDS, 1, [Define to support the subordinate IDs.])
|
|
||||||
enable_subids="yes"
|
|
||||||
else
|
|
||||||
if test "x$enable_subids" = "xyes"; then
|
|
||||||
AC_MSG_ERROR([Cannot enable support the subordinate IDs on systems where gid_t or uid_t has less than 32 bits])
|
|
||||||
fi
|
|
||||||
enable_subids="no"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(ENABLE_SUBIDS, test "x$enable_subids" != "xno")
|
|
||||||
|
|
||||||
AC_SUBST(LIBCRYPT)
|
|
||||||
AC_CHECK_LIB(crypt, crypt, [LIBCRYPT=-lcrypt],
|
|
||||||
[AC_MSG_ERROR([crypt() not found])])
|
|
||||||
|
|
||||||
AC_SUBST(LIBACL)
|
|
||||||
if test "$with_acl" != "no"; then
|
|
||||||
AC_CHECK_HEADERS(acl/libacl.h attr/error_context.h, [acl_header="yes"], [acl_header="no"])
|
|
||||||
if test "$acl_header$with_acl" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([acl/libacl.h or attr/error_context.h is missing])
|
|
||||||
elif test "$acl_header" = "yes" ; then
|
|
||||||
AC_CHECK_LIB(acl, perm_copy_file,
|
|
||||||
[AC_CHECK_LIB(acl, perm_copy_fd,
|
|
||||||
[acl_lib="yes"],
|
|
||||||
[acl_lib="no"])],
|
|
||||||
[acl_lib="no"])
|
|
||||||
if test "$acl_lib$with_acl" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([libacl not found])
|
|
||||||
elif test "$acl_lib" = "no" ; then
|
|
||||||
with_acl="no"
|
|
||||||
else
|
|
||||||
AC_DEFINE(WITH_ACL, 1,
|
|
||||||
[Build shadow with ACL support])
|
|
||||||
LIBACL="-lacl"
|
|
||||||
with_acl="yes"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
with_acl="no"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(LIBATTR)
|
|
||||||
if test "$with_attr" != "no"; then
|
|
||||||
AC_CHECK_HEADERS(attr/libattr.h attr/error_context.h, [attr_header="yes"], [attr_header="no"])
|
|
||||||
if test "$attr_header$with_attr" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([attr/libattr.h or attr/error_context.h is missing])
|
|
||||||
elif test "$attr_header" = "yes" ; then
|
|
||||||
AC_CHECK_LIB(attr, attr_copy_file,
|
|
||||||
[AC_CHECK_LIB(attr, attr_copy_fd,
|
|
||||||
[attr_lib="yes"],
|
|
||||||
[attr_lib="no"])],
|
|
||||||
[attr_lib="no"])
|
|
||||||
if test "$attr_lib$with_attr" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([libattr not found])
|
|
||||||
elif test "$attr_lib" = "no" ; then
|
|
||||||
with_attr="no"
|
|
||||||
else
|
|
||||||
AC_DEFINE(WITH_ATTR, 1,
|
|
||||||
[Build shadow with Extended Attributes support])
|
|
||||||
LIBATTR="-lattr"
|
|
||||||
with_attr="yes"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
with_attr="no"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(LIBAUDIT)
|
|
||||||
if test "$with_audit" != "no"; then
|
|
||||||
AC_CHECK_HEADER(libaudit.h, [audit_header="yes"], [audit_header="no"])
|
|
||||||
if test "$audit_header$with_audit" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([libaudit.h is missing])
|
|
||||||
elif test "$audit_header" = "yes"; then
|
|
||||||
AC_CHECK_DECL(AUDIT_ADD_USER,,[audit_header="no"],[#include <libaudit.h>])
|
|
||||||
AC_CHECK_DECL(AUDIT_DEL_USER,,[audit_header="no"],[#include <libaudit.h>])
|
|
||||||
AC_CHECK_DECL(AUDIT_ADD_GROUP,,[audit_header="no"],[#include <libaudit.h>])
|
|
||||||
AC_CHECK_DECL(AUDIT_DEL_GROUP,,[audit_header="no"],[#include <libaudit.h>])
|
|
||||||
if test "$audit_header$with_audit" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([AUDIT_ADD_USER AUDIT_DEL_USER AUDIT_ADD_GROUP or AUDIT_DEL_GROUP missing from libaudit.h])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$audit_header" = "yes"; then
|
|
||||||
AC_CHECK_LIB(audit, audit_log_acct_message,
|
|
||||||
[audit_lib="yes"], [audit_lib="no"])
|
|
||||||
if test "$audit_lib$with_audit" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([libaudit not found])
|
|
||||||
elif test "$audit_lib" = "no" ; then
|
|
||||||
with_audit="no"
|
|
||||||
else
|
|
||||||
AC_DEFINE(WITH_AUDIT, 1,
|
|
||||||
[Define if you want to enable Audit messages])
|
|
||||||
LIBAUDIT="-laudit"
|
|
||||||
with_audit="yes"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
with_audit="no"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(LIBCRACK)
|
|
||||||
if test "$with_libcrack" = "yes"; then
|
|
||||||
echo "checking cracklib flavour, don't be surprised by the results"
|
|
||||||
AC_CHECK_LIB(crack, FascistCheck,
|
|
||||||
[LIBCRACK=-lcrack AC_DEFINE(HAVE_LIBCRACK, 1, [Defined if you have libcrack.])])
|
|
||||||
AC_CHECK_LIB(crack, FascistHistory,
|
|
||||||
AC_DEFINE(HAVE_LIBCRACK_HIST, 1, [Defined if you have the ts&szs cracklib.]))
|
|
||||||
AC_CHECK_LIB(crack, FascistHistoryPw,
|
|
||||||
AC_DEFINE(HAVE_LIBCRACK_PW, 1, [Defined if it includes *Pw functions.]))
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$with_btrfs" != "no"; then
|
|
||||||
AC_CHECK_HEADERS([sys/statfs.h linux/magic.h linux/btrfs_tree.h], \
|
|
||||||
[btrfs_headers="yes"], [btrfs_headers="no"])
|
|
||||||
if test "$btrfs_headers$with_btrfs" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([One of sys/statfs.h linux/magic.h linux/btrfs_tree.h is missing])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$btrfs_headers" = "yes" ; then
|
|
||||||
AC_DEFINE(WITH_BTRFS, 1, [Build shadow with BtrFS support])
|
|
||||||
with_btrfs="yes"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(WITH_BTRFS, test x$with_btrfs = xyes)
|
|
||||||
|
|
||||||
AC_SUBST(LIBSELINUX)
|
|
||||||
AC_SUBST(LIBSEMANAGE)
|
|
||||||
if test "$with_selinux" != "no"; then
|
|
||||||
AC_CHECK_HEADERS(selinux/selinux.h, [selinux_header="yes"], [selinux_header="no"])
|
|
||||||
if test "$selinux_header$with_selinux" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([selinux/selinux.h is missing])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS(semanage/semanage.h, [semanage_header="yes"], [semanage_header="no"])
|
|
||||||
if test "$semanage_header$with_selinux" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([semanage/semanage.h is missing])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$selinux_header$semanage_header" = "yesyes" ; then
|
|
||||||
AC_CHECK_LIB(selinux, is_selinux_enabled, [selinux_lib="yes"], [selinux_lib="no"])
|
|
||||||
if test "$selinux_lib$with_selinux" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([libselinux not found])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_LIB(semanage, semanage_connect, [semanage_lib="yes"], [semanage_lib="no"])
|
|
||||||
if test "$semanage_lib$with_selinux" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([libsemanage not found])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$selinux_lib$semanage_lib" = "yesyes" ; then
|
|
||||||
AC_DEFINE(WITH_SELINUX, 1,
|
|
||||||
[Build shadow with SELinux support])
|
|
||||||
LIBSELINUX="-lselinux"
|
|
||||||
LIBSEMANAGE="-lsemanage"
|
|
||||||
with_selinux="yes"
|
|
||||||
else
|
|
||||||
with_selinux="no"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
with_selinux="no"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(LIBTCB)
|
|
||||||
if test "$with_tcb" != "no"; then
|
|
||||||
AC_CHECK_HEADERS(tcb.h, [tcb_header="yes"], [tcb_header="no"])
|
|
||||||
if test "$tcb_header$with_tcb" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([tcb.h is missing])
|
|
||||||
elif test "$tcb_header" = "yes" ; then
|
|
||||||
AC_CHECK_LIB(tcb, tcb_is_suspect, [tcb_lib="yes"], [tcb_lib="no"])
|
|
||||||
if test "$tcb_lib$with_tcb" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR([libtcb not found])
|
|
||||||
elif test "$tcb_lib" = "no" ; then
|
|
||||||
with_tcb="no"
|
|
||||||
else
|
|
||||||
AC_DEFINE(WITH_TCB, 1, [Build shadow with tcb support (incomplete)])
|
|
||||||
LIBTCB="-ltcb"
|
|
||||||
with_tcb="yes"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
with_tcb="no"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(WITH_TCB, test x$with_tcb = xyes)
|
|
||||||
|
|
||||||
AC_SUBST(LIBPAM)
|
|
||||||
if test "$with_libpam" != "no"; then
|
|
||||||
AC_CHECK_LIB(pam, pam_start,
|
|
||||||
[pam_lib="yes"], [pam_lib="no"])
|
|
||||||
if test "$pam_lib$with_libpam" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR(libpam not found)
|
|
||||||
fi
|
|
||||||
|
|
||||||
LIBPAM="-lpam"
|
|
||||||
pam_conv_function="no"
|
|
||||||
|
|
||||||
AC_CHECK_LIB(pam, openpam_ttyconv,
|
|
||||||
[pam_conv_function="openpam_ttyconv"],
|
|
||||||
AC_CHECK_LIB(pam_misc, misc_conv,
|
|
||||||
[pam_conv_function="misc_conv"; LIBPAM="$LIBPAM -lpam_misc"])
|
|
||||||
)
|
|
||||||
|
|
||||||
if test "$pam_conv_function$with_libpam" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR(PAM conversation function not found)
|
|
||||||
fi
|
|
||||||
|
|
||||||
pam_headers_found=no
|
|
||||||
AC_CHECK_HEADERS( [security/openpam.h security/pam_misc.h],
|
|
||||||
[ pam_headers_found=yes ; break ], [],
|
|
||||||
[ #include <security/pam_appl.h> ] )
|
|
||||||
if test "$pam_headers_found$with_libpam" = "noyes" ; then
|
|
||||||
AC_MSG_ERROR(PAM headers not found)
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if test "$pam_lib$pam_headers_found" = "yesyes" -a "$pam_conv_function" != "no" ; then
|
|
||||||
with_libpam="yes"
|
|
||||||
else
|
|
||||||
with_libpam="no"
|
|
||||||
unset LIBPAM
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
dnl Now with_libpam is either yes or no
|
|
||||||
if test "$with_libpam" = "yes"; then
|
|
||||||
AC_CHECK_DECLS([PAM_ESTABLISH_CRED,
|
|
||||||
PAM_DELETE_CRED,
|
|
||||||
PAM_NEW_AUTHTOK_REQD,
|
|
||||||
PAM_DATA_SILENT],
|
|
||||||
[], [], [#include <security/pam_appl.h>])
|
|
||||||
|
|
||||||
|
|
||||||
save_libs=$LIBS
|
|
||||||
LIBS="$LIBS $LIBPAM"
|
|
||||||
# We do not use AC_CHECK_FUNCS to avoid duplicated definition with
|
|
||||||
# Linux PAM.
|
|
||||||
AC_CHECK_FUNC(pam_fail_delay, [AC_DEFINE(HAS_PAM_FAIL_DELAY, 1, [Define to 1 if you have the declaration of 'pam_fail_delay'])])
|
|
||||||
LIBS=$save_libs
|
|
||||||
|
|
||||||
AC_DEFINE(USE_PAM, 1, [Define to support Pluggable Authentication Modules])
|
|
||||||
AC_DEFINE_UNQUOTED(SHADOW_PAM_CONVERSATION, [$pam_conv_function],[PAM conversation to use])
|
|
||||||
AM_CONDITIONAL(USE_PAM, [true])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(use login and su access checking if PAM not used)
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
else
|
|
||||||
AC_DEFINE(SU_ACCESS, 1, [Define to support /etc/suauth su access control.])
|
|
||||||
AM_CONDITIONAL(USE_PAM, [false])
|
|
||||||
AC_MSG_CHECKING(use login and su access checking if PAM not used)
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$enable_acct_tools_setuid" != "no"; then
|
|
||||||
if test "$with_libpam" != "yes"; then
|
|
||||||
if test "$enable_acct_tools_setuid" = "yes"; then
|
|
||||||
AC_MSG_ERROR(PAM support is required for --enable-account-tools-setuid)
|
|
||||||
else
|
|
||||||
enable_acct_tools_setuid="no"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
enable_acct_tools_setuid="yes"
|
|
||||||
fi
|
|
||||||
if test "$enable_acct_tools_setuid" = "yes"; then
|
|
||||||
AC_DEFINE(ACCT_TOOLS_SETUID,
|
|
||||||
1,
|
|
||||||
[Define if account management tools should be installed setuid and authenticate the callers])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(ACCT_TOOLS_SETUID, test "x$enable_acct_tools_setuid" = "xyes")
|
|
||||||
|
|
||||||
|
|
||||||
AC_ARG_WITH(fcaps,
|
|
||||||
[AC_HELP_STRING([--with-fcaps], [use file capabilities instead of suid binaries for newuidmap/newgidmap @<:@default=no@:>@])],
|
|
||||||
[with_fcaps=$withval], [with_fcaps=no])
|
|
||||||
AM_CONDITIONAL(FCAPS, test "x$with_fcaps" = "xyes")
|
|
||||||
|
|
||||||
if test "x$with_fcaps" = "xyes"; then
|
|
||||||
AC_CHECK_PROGS(capcmd, "setcap")
|
|
||||||
if test "x$capcmd" = "x" ; then
|
|
||||||
AC_MSG_ERROR([setcap command not available])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(LIBSKEY)
|
|
||||||
AC_SUBST(LIBMD)
|
|
||||||
if test "$with_skey" = "yes"; then
|
|
||||||
AC_CHECK_LIB(md, MD5Init, [LIBMD=-lmd])
|
|
||||||
AC_CHECK_LIB(skey, skeychallenge, [LIBSKEY=-lskey],
|
|
||||||
[AC_MSG_ERROR([liskey missing. You can download S/Key source code from http://rsync1.it.gentoo.org/gentoo/distfiles/skey-1.1.5.tar.bz2])])
|
|
||||||
AC_DEFINE(SKEY, 1, [Define to support S/Key logins.])
|
|
||||||
AC_TRY_COMPILE([
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <skey.h>
|
|
||||||
],[
|
|
||||||
skeychallenge((void*)0, (void*)0, (void*)0, 0);
|
|
||||||
],[AC_DEFINE(SKEY_BSD_STYLE, 1, [Define to support newer BSD S/Key API])])
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$enable_utmpx" = "yes"; then
|
|
||||||
if test "$ac_cv_header_utmpx_h" != "yes"; then
|
|
||||||
AC_MSG_ERROR([The utmpx.h header file is required for utmpx support.])
|
|
||||||
fi
|
|
||||||
AC_DEFINE(USE_UTMPX,
|
|
||||||
1,
|
|
||||||
[Define if utmpx should be used])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(SHELL, ["$SHELL"], [The default shell.])
|
|
||||||
|
|
||||||
AM_GNU_GETTEXT_VERSION(0.16)
|
|
||||||
AM_GNU_GETTEXT([external], [need-ngettext])
|
|
||||||
AM_CONDITIONAL(USE_NLS, test "x$USE_NLS" = "xyes")
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([
|
|
||||||
Makefile
|
|
||||||
po/Makefile.in
|
|
||||||
doc/Makefile
|
|
||||||
man/Makefile
|
|
||||||
man/config.xml
|
|
||||||
man/po/Makefile
|
|
||||||
man/cs/Makefile
|
|
||||||
man/da/Makefile
|
|
||||||
man/de/Makefile
|
|
||||||
man/es/Makefile
|
|
||||||
man/fi/Makefile
|
|
||||||
man/fr/Makefile
|
|
||||||
man/hu/Makefile
|
|
||||||
man/id/Makefile
|
|
||||||
man/it/Makefile
|
|
||||||
man/ja/Makefile
|
|
||||||
man/ko/Makefile
|
|
||||||
man/pl/Makefile
|
|
||||||
man/pt_BR/Makefile
|
|
||||||
man/ru/Makefile
|
|
||||||
man/sv/Makefile
|
|
||||||
man/tr/Makefile
|
|
||||||
man/zh_CN/Makefile
|
|
||||||
man/zh_TW/Makefile
|
|
||||||
libmisc/Makefile
|
|
||||||
lib/Makefile
|
|
||||||
src/Makefile
|
|
||||||
contrib/Makefile
|
|
||||||
etc/Makefile
|
|
||||||
etc/pam.d/Makefile
|
|
||||||
shadow.spec
|
|
||||||
])
|
|
||||||
AC_OUTPUT
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "shadow will be compiled with the following features:"
|
|
||||||
echo
|
|
||||||
echo " auditing support: $with_audit"
|
|
||||||
echo " CrackLib support: $with_libcrack"
|
|
||||||
echo " PAM support: $with_libpam"
|
|
||||||
if test "$with_libpam" = "yes"; then
|
|
||||||
echo " suid account management tools: $enable_acct_tools_setuid"
|
|
||||||
fi
|
|
||||||
echo " SELinux support: $with_selinux"
|
|
||||||
echo " BtrFS support: $with_btrfs"
|
|
||||||
echo " ACL support: $with_acl"
|
|
||||||
echo " Extended Attributes support: $with_attr"
|
|
||||||
echo " tcb support (incomplete): $with_tcb"
|
|
||||||
echo " shadow group support: $enable_shadowgrp"
|
|
||||||
echo " S/Key support: $with_skey"
|
|
||||||
echo " SHA passwords encryption: $with_sha_crypt"
|
|
||||||
echo " bcrypt passwords encryption: $with_bcrypt"
|
|
||||||
echo " nscd support: $with_nscd"
|
|
||||||
echo " sssd support: $with_sssd"
|
|
||||||
echo " subordinate IDs support: $enable_subids"
|
|
||||||
echo " use file caps: $with_fcaps"
|
|
||||||
echo " install su: $with_su"
|
|
||||||
echo
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
|
||||||
# and also cooperate to make a distribution for `make dist'
|
|
||||||
|
|
||||||
EXTRA_DIST = README adduser.c adduser-old.c adduser.sh adduser2.sh \
|
|
||||||
atudel groupmems.shar pwdauth.c shadow-anonftp.patch \
|
|
||||||
udbachk.tgz
|
|
||||||
@@ -1,482 +0,0 @@
|
|||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 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@
|
|
||||||
|
|
||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
|
||||||
# and also cooperate to make a distribution for `make dist'
|
|
||||||
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 = contrib
|
|
||||||
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_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 README
|
|
||||||
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@
|
|
||||||
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@
|
|
||||||
ECONF_CPPFLAGS = @ECONF_CPPFLAGS@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
FGREP = @FGREP@
|
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
|
||||||
GMSGFMT = @GMSGFMT@
|
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
|
||||||
GREP = @GREP@
|
|
||||||
GROUP_NAME_MAX_LENGTH = @GROUP_NAME_MAX_LENGTH@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
INTLLIBS = @INTLLIBS@
|
|
||||||
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBACL = @LIBACL@
|
|
||||||
LIBATTR = @LIBATTR@
|
|
||||||
LIBAUDIT = @LIBAUDIT@
|
|
||||||
LIBCRACK = @LIBCRACK@
|
|
||||||
LIBCRYPT = @LIBCRYPT@
|
|
||||||
LIBECONF = @LIBECONF@
|
|
||||||
LIBICONV = @LIBICONV@
|
|
||||||
LIBINTL = @LIBINTL@
|
|
||||||
LIBMD = @LIBMD@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBPAM = @LIBPAM@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LIBSELINUX = @LIBSELINUX@
|
|
||||||
LIBSEMANAGE = @LIBSEMANAGE@
|
|
||||||
LIBSKEY = @LIBSKEY@
|
|
||||||
LIBTCB = @LIBTCB@
|
|
||||||
LIBTOOL = @LIBTOOL@
|
|
||||||
LIPO = @LIPO@
|
|
||||||
LN_S = @LN_S@
|
|
||||||
LTLIBICONV = @LTLIBICONV@
|
|
||||||
LTLIBINTL = @LTLIBINTL@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
|
||||||
MAINT = @MAINT@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
MSGFMT = @MSGFMT@
|
|
||||||
MSGFMT_015 = @MSGFMT_015@
|
|
||||||
MSGMERGE = @MSGMERGE@
|
|
||||||
NM = @NM@
|
|
||||||
NMEDIT = @NMEDIT@
|
|
||||||
OBJDUMP = @OBJDUMP@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
OTOOL = @OTOOL@
|
|
||||||
OTOOL64 = @OTOOL64@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
POSUB = @POSUB@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
USE_NLS = @USE_NLS@
|
|
||||||
VENDORDIR = @VENDORDIR@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
XGETTEXT = @XGETTEXT@
|
|
||||||
XGETTEXT_015 = @XGETTEXT_015@
|
|
||||||
XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
|
|
||||||
XMLCATALOG = @XMLCATALOG@
|
|
||||||
XML_CATALOG_FILE = @XML_CATALOG_FILE@
|
|
||||||
XSLTPROC = @XSLTPROC@
|
|
||||||
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@
|
|
||||||
capcmd = @capcmd@
|
|
||||||
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@
|
|
||||||
EXTRA_DIST = README adduser.c adduser-old.c adduser.sh adduser2.sh \
|
|
||||||
atudel groupmems.shar pwdauth.c shadow-anonftp.patch \
|
|
||||||
udbachk.tgz
|
|
||||||
|
|
||||||
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 contrib/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --foreign contrib/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
|
|
||||||
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:
|
|
||||||
|
|
||||||
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-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-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
|
|
||||||
|
|
||||||
|
|
||||||
# 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:
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
People keep sending various adduser programs and scripts... They are
|
|
||||||
all in this directory. I haven't tested them, use at your own risk.
|
|
||||||
Anyway, the best one I've seen so far is adduser-3.x from Debian.
|
|
||||||
|
|
||||||
atudel is a perl script to remove at jobs owned by the specified user
|
|
||||||
(atrm in at-2.9 for Linux can't do that).
|
|
||||||
|
|
||||||
udbachk.tgz is a passwd/group/shadow file integrity checker.
|
|
||||||
|
|
||||||
--marekm
|
|
||||||
@@ -1,300 +0,0 @@
|
|||||||
/****
|
|
||||||
** 03/17/96
|
|
||||||
** hacked a bit more, removed unused code, cleaned up for gcc -Wall.
|
|
||||||
** --marekm
|
|
||||||
**
|
|
||||||
** 02/26/96
|
|
||||||
** modified to call shadow utils (useradd,chage,passwd) on shadowed
|
|
||||||
** systems - Cristian Gafton, gafton@sorosis.ro
|
|
||||||
**
|
|
||||||
** 6/27/95
|
|
||||||
** shadow-adduser 1.4:
|
|
||||||
**
|
|
||||||
** now it copies the /etc/skel dir into the person's dir,
|
|
||||||
** makes the mail folders, changed some defaults and made a 'make
|
|
||||||
** install' just for the hell of it.
|
|
||||||
**
|
|
||||||
** Greg Gallagher
|
|
||||||
** CIN.Net
|
|
||||||
**
|
|
||||||
** 1/28/95
|
|
||||||
** shadow-adduser 1.3:
|
|
||||||
**
|
|
||||||
** Basically a bug-fix on my additions in 1.2. Thanks to Terry Stewart
|
|
||||||
** (stew@texas.net) for pointing out one of the many idiotic bugs I introduced.
|
|
||||||
** It was such a stupid bug that I would have never seen it myself.
|
|
||||||
**
|
|
||||||
** Brandon
|
|
||||||
*****
|
|
||||||
** 01/27/95
|
|
||||||
**
|
|
||||||
** shadow-adduser 1.2:
|
|
||||||
** I took the C source from adduser-shadow (credits are below) and made
|
|
||||||
** it a little more worthwhile. Many small changes... Here's
|
|
||||||
** the ones I can remember:
|
|
||||||
**
|
|
||||||
** Removed support for non-shadowed systems (if you don't have shadow,
|
|
||||||
** use the original adduser, don't get this shadow version!)
|
|
||||||
** Added support for the correct /etc/shadow fields (Min days before
|
|
||||||
** password change, max days before password change, Warning days,
|
|
||||||
** and how many days from expiry date does the account go invalid)
|
|
||||||
** The previous version just left all of those fields blank.
|
|
||||||
** There is still one field left (expiry date for the account, period)
|
|
||||||
** which I have left blank because I do not use it and didn't want to
|
|
||||||
** spend any more time on this. I'm sure someone will put it in and
|
|
||||||
** tack another plethora of credits on here. :)
|
|
||||||
** Added in the password date field, which should always reflect the last
|
|
||||||
** date the password was changed, for expiry purposes. "passwd" always
|
|
||||||
** updates this field, so the adduser program should set it up right
|
|
||||||
** initially (or a user could keep thier initial password forever ;)
|
|
||||||
** The number is in days since Jan 1st, 1970.
|
|
||||||
**
|
|
||||||
** Have fun with it, and someone please make
|
|
||||||
** a real version(this is still just a hack)
|
|
||||||
** for us all to use (and Email it to me???)
|
|
||||||
**
|
|
||||||
** Brandon
|
|
||||||
** photon@usis.com
|
|
||||||
**
|
|
||||||
*****
|
|
||||||
** adduser 1.0: add a new user account (For systems not using shadow)
|
|
||||||
** With a nice little interface and a will to do all the work for you.
|
|
||||||
**
|
|
||||||
** Craig Hagan
|
|
||||||
** hagan@opine.cs.umass.edu
|
|
||||||
**
|
|
||||||
** Modified to really work, look clean, and find unused uid by Chris Cappuccio
|
|
||||||
** chris@slinky.cs.umass.edu
|
|
||||||
**
|
|
||||||
*****
|
|
||||||
**
|
|
||||||
** 01/19/95
|
|
||||||
**
|
|
||||||
** FURTHER modifications to enable shadow passwd support (kludged, but
|
|
||||||
** no more so than the original) by Dan Crowson - dcrowson@mo.net
|
|
||||||
**
|
|
||||||
** Search on DAN for all changes...
|
|
||||||
**
|
|
||||||
*****
|
|
||||||
**
|
|
||||||
** cc -O -o adduser adduser.c
|
|
||||||
** Use gcc if you have it... (political reasons beyond my control) (chris)
|
|
||||||
**
|
|
||||||
** I've gotten this program to work with success under Linux (without
|
|
||||||
** shadow) and SunOS 4.1.3. I would assume it should work pretty well
|
|
||||||
** on any system that uses no shadow. (chris)
|
|
||||||
**
|
|
||||||
** If you have no crypt() then try
|
|
||||||
** cc -DNO_CRYPT -O -o adduser adduser.c xfdes.c
|
|
||||||
** I'm not sure how login operates with no crypt()... I guess
|
|
||||||
** the same way we're doing it here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <grp.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/timeb.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#define DEFAULT_SHELL "/bin/bash" /* because BASH is your friend */
|
|
||||||
#define DEFAULT_HOME "/home"
|
|
||||||
#define USERADD_PATH "/usr/sbin/useradd"
|
|
||||||
#define CHAGE_PATH "/usr/sbin/chage"
|
|
||||||
#define PASSWD_PATH "/usr/bin/passwd"
|
|
||||||
#define DEFAULT_GROUP 100
|
|
||||||
|
|
||||||
#define DEFAULT_MAX_PASS 60
|
|
||||||
#define DEFAULT_WARN_PASS 10
|
|
||||||
/* if you use this feature, you will get a lot of complaints from users
|
|
||||||
who rarely use their accounts :) (something like 3 months would be
|
|
||||||
more reasonable) --marekm */
|
|
||||||
#define DEFAULT_USER_DIE /* 10 */ 0
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
char foo[32];
|
|
||||||
char uname[9],person[32],dir[32],shell[32];
|
|
||||||
unsigned int group,min_pass,max_pass,warn_pass,user_die;
|
|
||||||
/* the group and uid of the new user */
|
|
||||||
int bad=0,done=0,correct=0,gets_warning=0;
|
|
||||||
char cmd[255];
|
|
||||||
struct group *grp;
|
|
||||||
|
|
||||||
/* flags, in order:
|
|
||||||
* bad to see if the username is in /etc/passwd, or if strange stuff has
|
|
||||||
* been typed if the user might be put in group 0
|
|
||||||
* done allows the program to exit when a user has been added
|
|
||||||
* correct loops until a password is found that isn't in /etc/passwd
|
|
||||||
* gets_warning allows the fflush to be skipped for the first gets
|
|
||||||
* so that output is still legible
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The real program starts HERE! */
|
|
||||||
|
|
||||||
if(geteuid()!=0)
|
|
||||||
{
|
|
||||||
printf("It seems you don't have access to add a new user. Try\n");
|
|
||||||
printf("logging in as root or su root to gain super-user access.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sanity checks
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!(grp=getgrgid(DEFAULT_GROUP))){
|
|
||||||
printf("Error: the default group %d does not exist on this system!\n",
|
|
||||||
DEFAULT_GROUP);
|
|
||||||
printf("adduser must be recompiled.\n");
|
|
||||||
exit(1);
|
|
||||||
};
|
|
||||||
|
|
||||||
while(!correct) { /* loop until a "good" uname is chosen */
|
|
||||||
while(!done) {
|
|
||||||
printf("\nLogin to add (^C to quit): ");
|
|
||||||
if(gets_warning) /* if the warning was already shown */
|
|
||||||
fflush(stdout); /* fflush stdout, otherwise set the flag */
|
|
||||||
else
|
|
||||||
gets_warning=1;
|
|
||||||
|
|
||||||
gets(uname);
|
|
||||||
if(!strlen(uname)) {
|
|
||||||
printf("Empty input.\n");
|
|
||||||
done=0;
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* what I saw here before made me think maybe I was running DOS */
|
|
||||||
/* might this be a solution? (chris) */
|
|
||||||
if (getpwnam(uname) != NULL) {
|
|
||||||
printf("That name is in use, choose another.\n");
|
|
||||||
done=0;
|
|
||||||
} else
|
|
||||||
done=1;
|
|
||||||
}; /* done, we have a valid new user name */
|
|
||||||
|
|
||||||
/* all set, get the rest of the stuff */
|
|
||||||
printf("\nEditing information for new user [%s]\n",uname);
|
|
||||||
|
|
||||||
printf("\nFull Name [%s]: ",uname);
|
|
||||||
gets(person);
|
|
||||||
if (!strlen(person)) {
|
|
||||||
bzero(person,sizeof(person));
|
|
||||||
strcpy(person,uname);
|
|
||||||
};
|
|
||||||
|
|
||||||
do {
|
|
||||||
bad=0;
|
|
||||||
printf("GID [%d]: ",DEFAULT_GROUP);
|
|
||||||
gets(foo);
|
|
||||||
if (!strlen(foo))
|
|
||||||
group=DEFAULT_GROUP;
|
|
||||||
else
|
|
||||||
if (isdigit (*foo)) {
|
|
||||||
group = atoi(foo);
|
|
||||||
if (! (grp = getgrgid (group))) {
|
|
||||||
printf("unknown gid %s\n",foo);
|
|
||||||
group=DEFAULT_GROUP;
|
|
||||||
bad=1;
|
|
||||||
};
|
|
||||||
} else
|
|
||||||
if ((grp = getgrnam (foo)))
|
|
||||||
group = grp->gr_gid;
|
|
||||||
else {
|
|
||||||
printf("unknown group %s\n",foo);
|
|
||||||
group=DEFAULT_GROUP;
|
|
||||||
bad=1;
|
|
||||||
}
|
|
||||||
if (group==0){ /* You're not allowed to make root group users! */
|
|
||||||
printf("Creation of root group users not allowed (must be done by hand)\n");
|
|
||||||
group=DEFAULT_GROUP;
|
|
||||||
bad=1;
|
|
||||||
};
|
|
||||||
} while(bad);
|
|
||||||
|
|
||||||
|
|
||||||
fflush(stdin);
|
|
||||||
|
|
||||||
printf("\nIf home dir ends with a / then [%s] will be appended to it\n",uname);
|
|
||||||
printf("Home Directory [%s/%s]: ",DEFAULT_HOME,uname);
|
|
||||||
fflush(stdout);
|
|
||||||
gets(dir);
|
|
||||||
if (!strlen(dir)) { /* hit return */
|
|
||||||
sprintf(dir,"%s/%s",DEFAULT_HOME,uname);
|
|
||||||
fflush(stdin);
|
|
||||||
} else
|
|
||||||
if (dir[strlen(dir)-1]=='/')
|
|
||||||
sprintf(dir+strlen(dir),"%s",uname);
|
|
||||||
|
|
||||||
printf("\nShell [%s]: ",DEFAULT_SHELL);
|
|
||||||
fflush(stdout);
|
|
||||||
gets(shell);
|
|
||||||
if (!strlen(shell))
|
|
||||||
sprintf(shell,"%s",DEFAULT_SHELL);
|
|
||||||
|
|
||||||
printf("\nMin. Password Change Days [0]: ");
|
|
||||||
gets(foo);
|
|
||||||
min_pass=atoi(foo);
|
|
||||||
|
|
||||||
printf("Max. Password Change Days [%d]: ",DEFAULT_MAX_PASS);
|
|
||||||
gets(foo);
|
|
||||||
if (strlen(foo) > 1)
|
|
||||||
max_pass = atoi(foo);
|
|
||||||
else
|
|
||||||
max_pass = DEFAULT_MAX_PASS;
|
|
||||||
|
|
||||||
printf("Password Warning Days [%d]: ",DEFAULT_WARN_PASS);
|
|
||||||
gets(foo);
|
|
||||||
warn_pass = atoi(foo);
|
|
||||||
if (warn_pass==0)
|
|
||||||
warn_pass = DEFAULT_WARN_PASS;
|
|
||||||
|
|
||||||
printf("Days after Password Expiry for Account Locking [%d]: ",DEFAULT_USER_DIE);
|
|
||||||
gets(foo);
|
|
||||||
user_die = atoi(foo);
|
|
||||||
if (user_die == 0)
|
|
||||||
user_die = DEFAULT_USER_DIE;
|
|
||||||
|
|
||||||
printf("\nInformation for new user [%s] [%s]:\n",uname,person);
|
|
||||||
printf("Home directory: [%s] Shell: [%s]\n",dir,shell);
|
|
||||||
printf("GID: [%d]\n",group);
|
|
||||||
printf("MinPass: [%d] MaxPass: [%d] WarnPass: [%d] UserExpire: [%d]\n",
|
|
||||||
min_pass,max_pass,warn_pass,user_die);
|
|
||||||
printf("\nIs this correct? [y/N]: ");
|
|
||||||
fflush(stdout);
|
|
||||||
gets(foo);
|
|
||||||
|
|
||||||
done=bad=correct=(foo[0]=='y'||foo[0]=='Y');
|
|
||||||
|
|
||||||
if(bad!=1)
|
|
||||||
printf("\nUser [%s] not added\n",uname);
|
|
||||||
}
|
|
||||||
|
|
||||||
bzero(cmd,sizeof(cmd));
|
|
||||||
sprintf(cmd,"%s -g %d -d %s -s %s -c \"%s\" -m -k /etc/skel %s",
|
|
||||||
USERADD_PATH,group,dir,shell,person,uname);
|
|
||||||
printf("Calling useradd to add new user:\n%s\n",cmd);
|
|
||||||
if(system(cmd)){
|
|
||||||
printf("User add failed!\n");
|
|
||||||
exit(errno);
|
|
||||||
};
|
|
||||||
bzero(cmd,sizeof(cmd));
|
|
||||||
sprintf(cmd,"%s -m %d -M %d -W %d -I %d %s", CHAGE_PATH,
|
|
||||||
min_pass,max_pass,warn_pass,user_die,uname);
|
|
||||||
printf("%s\n",cmd);
|
|
||||||
if(system(cmd)){
|
|
||||||
printf("There was an error setting password expire values\n");
|
|
||||||
exit(errno);
|
|
||||||
};
|
|
||||||
bzero(cmd,sizeof(cmd));
|
|
||||||
sprintf(cmd,"%s %s",PASSWD_PATH,uname);
|
|
||||||
system(cmd);
|
|
||||||
printf("\nDone.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,502 +0,0 @@
|
|||||||
/****
|
|
||||||
** 04/21/96
|
|
||||||
** hacked even more, replaced gets() with something slightly harder to buffer
|
|
||||||
** overflow. Added support for setting a default quota on new account, with
|
|
||||||
** edquota -p. Other cleanups for security, I let some users run adduser suid
|
|
||||||
** root to add new accounts. (overflow checks, clobber environment, valid
|
|
||||||
** shell checks, restrictions on gid + home dir settings).
|
|
||||||
|
|
||||||
** Added max. username length. Used syslog() a bit for important events.
|
|
||||||
** Support to immediately expire account with passwd -e.
|
|
||||||
|
|
||||||
** Called it version 2.0! Because I felt like it!
|
|
||||||
|
|
||||||
** -- Chris, chris@ferret.lmh.ox.ac.uk
|
|
||||||
|
|
||||||
** 03/17/96
|
|
||||||
** hacked a bit more, removed unused code, cleaned up for gcc -Wall.
|
|
||||||
** --marekm
|
|
||||||
**
|
|
||||||
** 02/26/96
|
|
||||||
** modified to call shadow utils (useradd,chage,passwd) on shadowed
|
|
||||||
** systems - Cristian Gafton, gafton@sorosis.ro
|
|
||||||
**
|
|
||||||
** 6/27/95
|
|
||||||
** shadow-adduser 1.4:
|
|
||||||
**
|
|
||||||
** now it copies the /etc/skel dir into the person's dir,
|
|
||||||
** makes the mail folders, changed some defaults and made a 'make
|
|
||||||
** install' just for the hell of it.
|
|
||||||
**
|
|
||||||
** Greg Gallagher
|
|
||||||
** CIN.Net
|
|
||||||
**
|
|
||||||
** 1/28/95
|
|
||||||
** shadow-adduser 1.3:
|
|
||||||
**
|
|
||||||
** Basically a bug-fix on my additions in 1.2. Thanks to Terry Stewart
|
|
||||||
** (stew@texas.net) for pointing out one of the many idiotic bugs I introduced.
|
|
||||||
** It was such a stupid bug that I would have never seen it myself.
|
|
||||||
**
|
|
||||||
** Brandon
|
|
||||||
*****
|
|
||||||
** 01/27/95
|
|
||||||
**
|
|
||||||
** shadow-adduser 1.2:
|
|
||||||
** I took the C source from adduser-shadow (credits are below) and made
|
|
||||||
** it a little more worthwhile. Many small changes... Here's
|
|
||||||
** the ones I can remember:
|
|
||||||
**
|
|
||||||
** Removed support for non-shadowed systems (if you don't have shadow,
|
|
||||||
** use the original adduser, don't get this shadow version!)
|
|
||||||
** Added support for the correct /etc/shadow fields (Min days before
|
|
||||||
** password change, max days before password change, Warning days,
|
|
||||||
** and how many days from expiry date does the account go invalid)
|
|
||||||
** The previous version just left all of those fields blank.
|
|
||||||
** There is still one field left (expiry date for the account, period)
|
|
||||||
** which I have left blank because I do not use it and didn't want to
|
|
||||||
** spend any more time on this. I'm sure someone will put it in and
|
|
||||||
** tack another plethora of credits on here. :)
|
|
||||||
** Added in the password date field, which should always reflect the last
|
|
||||||
** date the password was changed, for expiry purposes. "passwd" always
|
|
||||||
** updates this field, so the adduser program should set it up right
|
|
||||||
** initially (or a user could keep thier initial password forever ;)
|
|
||||||
** The number is in days since Jan 1st, 1970.
|
|
||||||
**
|
|
||||||
** Have fun with it, and someone please make
|
|
||||||
** a real version(this is still just a hack)
|
|
||||||
** for us all to use (and Email it to me???)
|
|
||||||
**
|
|
||||||
** Brandon
|
|
||||||
** photon@usis.com
|
|
||||||
**
|
|
||||||
*****
|
|
||||||
** adduser 1.0: add a new user account (For systems not using shadow)
|
|
||||||
** With a nice little interface and a will to do all the work for you.
|
|
||||||
**
|
|
||||||
** Craig Hagan
|
|
||||||
** hagan@opine.cs.umass.edu
|
|
||||||
**
|
|
||||||
** Modified to really work, look clean, and find unused uid by Chris Cappuccio
|
|
||||||
** chris@slinky.cs.umass.edu
|
|
||||||
**
|
|
||||||
*****
|
|
||||||
**
|
|
||||||
** 01/19/95
|
|
||||||
**
|
|
||||||
** FURTHER modifications to enable shadow passwd support (kludged, but
|
|
||||||
** no more so than the original) by Dan Crowson - dcrowson@mo.net
|
|
||||||
**
|
|
||||||
** Search on DAN for all changes...
|
|
||||||
**
|
|
||||||
*****
|
|
||||||
**
|
|
||||||
** cc -O -o adduser adduser.c
|
|
||||||
** Use gcc if you have it... (political reasons beyond my control) (chris)
|
|
||||||
**
|
|
||||||
** I've gotten this program to work with success under Linux (without
|
|
||||||
** shadow) and SunOS 4.1.3. I would assume it should work pretty well
|
|
||||||
** on any system that uses no shadow. (chris)
|
|
||||||
**
|
|
||||||
** If you have no crypt() then try
|
|
||||||
** cc -DNO_CRYPT -O -o adduser adduser.c xfdes.c
|
|
||||||
** I'm not sure how login operates with no crypt()... I guess
|
|
||||||
** the same way we're doing it here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <grp.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/timeb.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#define IMMEDIATE_CHANGE /* Expire newly created password, must be changed
|
|
||||||
* immediately upon next login */
|
|
||||||
#define HAVE_QUOTAS /* Obvious */
|
|
||||||
#define EXPIRE_VALS_SET /* If defined, 'normal' users can't change
|
|
||||||
* password expiry values (if running suid root) */
|
|
||||||
|
|
||||||
#define HAVE_GETUSERSHELL /* FIXME: Isn't this defined in config.h too? */
|
|
||||||
#define LOGGING /* If we want to log various things to syslog */
|
|
||||||
#define MAX_USRNAME 8 /* Longer usernames seem to work on my system....
|
|
||||||
* But they're probably a poor idea */
|
|
||||||
|
|
||||||
|
|
||||||
#define DEFAULT_SHELL "/bin/bash" /* because BASH is your friend */
|
|
||||||
#define DEFAULT_HOME "/home"
|
|
||||||
#define USERADD_PATH "/usr/sbin/useradd"
|
|
||||||
#define CHAGE_PATH "/usr/bin/chage"
|
|
||||||
#define PASSWD_PATH "/usr/bin/passwd"
|
|
||||||
#define EDQUOTA_PATH "/usr/sbin/edquota"
|
|
||||||
#define QUOTA_DEFAULT "defuser"
|
|
||||||
#define DEFAULT_GROUP 100
|
|
||||||
|
|
||||||
#define DEFAULT_MIN_PASS 0
|
|
||||||
#define DEFAULT_MAX_PASS 100
|
|
||||||
#define DEFAULT_WARN_PASS 14
|
|
||||||
#define DEFAULT_USER_DIE 366
|
|
||||||
|
|
||||||
void safeget (char *, int);
|
|
||||||
|
|
||||||
void
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
char foo[32];
|
|
||||||
char usrname[32], person[32], dir[32], shell[32];
|
|
||||||
unsigned int group, min_pass, max_pass, warn_pass, user_die;
|
|
||||||
/* the group and uid of the new user */
|
|
||||||
int bad = 0, done = 0, correct = 0, olduid;
|
|
||||||
char cmd[255];
|
|
||||||
struct group *grp;
|
|
||||||
|
|
||||||
/* flags, in order:
|
|
||||||
* bad to see if the username is in /etc/passwd, or if strange stuff has
|
|
||||||
* been typed if the user might be put in group 0
|
|
||||||
* done allows the program to exit when a user has been added
|
|
||||||
* correct loops until a username is found that isn't in /etc/passwd
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The real program starts HERE! */
|
|
||||||
|
|
||||||
if (geteuid () != 0)
|
|
||||||
{
|
|
||||||
printf ("It seems you don't have access to add a new user. Try\n");
|
|
||||||
printf ("logging in as root or su root to gain superuser access.\n");
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sanity checks
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef LOGGING
|
|
||||||
openlog ("adduser", LOG_PID | LOG_CONS | LOG_NOWAIT, LOG_AUTH);
|
|
||||||
syslog (LOG_INFO, "invoked by user %s\n", getpwuid (getuid ())->pw_name);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!(grp = getgrgid (DEFAULT_GROUP)))
|
|
||||||
{
|
|
||||||
printf ("Error: the default group %d does not exist on this system!\n",
|
|
||||||
DEFAULT_GROUP);
|
|
||||||
printf ("adduser must be recompiled.\n");
|
|
||||||
#ifdef LOGGING
|
|
||||||
syslog (LOG_ERR, "warning: failed. no such default group\n");
|
|
||||||
closelog ();
|
|
||||||
#endif
|
|
||||||
exit (1);
|
|
||||||
};
|
|
||||||
|
|
||||||
while (!correct)
|
|
||||||
{ /* loop until a "good" usrname is chosen */
|
|
||||||
while (!done)
|
|
||||||
{
|
|
||||||
printf ("\nLogin to add (^C to quit): ");
|
|
||||||
fflush (stdout);
|
|
||||||
|
|
||||||
safeget (usrname, sizeof (usrname));
|
|
||||||
|
|
||||||
if (!strlen (usrname))
|
|
||||||
{
|
|
||||||
printf ("Empty input.\n");
|
|
||||||
done = 0;
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* what I saw here before made me think maybe I was running DOS */
|
|
||||||
/* might this be a solution? (chris) */
|
|
||||||
if (strlen (usrname) > MAX_USRNAME)
|
|
||||||
{
|
|
||||||
printf ("That name is longer than the maximum of %d characters. Choose another.\n", MAX_USRNAME);
|
|
||||||
done = 0;
|
|
||||||
}
|
|
||||||
else if (getpwnam (usrname) != NULL)
|
|
||||||
{
|
|
||||||
printf ("That name is in use, choose another.\n");
|
|
||||||
done = 0;
|
|
||||||
}
|
|
||||||
else if (strchr (usrname, ' ') != NULL)
|
|
||||||
{
|
|
||||||
printf ("No spaces in username!!\n");
|
|
||||||
done = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
done = 1;
|
|
||||||
}; /* done, we have a valid new user name */
|
|
||||||
|
|
||||||
/* all set, get the rest of the stuff */
|
|
||||||
printf ("\nEditing information for new user [%s]\n", usrname);
|
|
||||||
|
|
||||||
printf ("\nFull Name [%s]: ", usrname);
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (person, sizeof (person));
|
|
||||||
if (!strlen (person))
|
|
||||||
{
|
|
||||||
bzero (person, sizeof (person));
|
|
||||||
strcpy (person, usrname);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (getuid () == 0)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
bad = 0;
|
|
||||||
printf ("GID [%d]: ", DEFAULT_GROUP);
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (foo, sizeof (foo));
|
|
||||||
if (!strlen (foo))
|
|
||||||
group = DEFAULT_GROUP;
|
|
||||||
else if (isdigit (*foo))
|
|
||||||
{
|
|
||||||
group = atoi (foo);
|
|
||||||
if (!(grp = getgrgid (group)))
|
|
||||||
{
|
|
||||||
printf ("unknown gid %s\n", foo);
|
|
||||||
group = DEFAULT_GROUP;
|
|
||||||
bad = 1;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else if ((grp = getgrnam (foo)))
|
|
||||||
group = grp->gr_gid;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf ("unknown group %s\n", foo);
|
|
||||||
group = DEFAULT_GROUP;
|
|
||||||
bad = 1;
|
|
||||||
}
|
|
||||||
if (group == 0)
|
|
||||||
{ /* You're not allowed to make root group users! */
|
|
||||||
printf ("Creation of root group users not allowed (must be done by hand)\n");
|
|
||||||
group = DEFAULT_GROUP;
|
|
||||||
bad = 1;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
while (bad);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf ("Group will be default of: %d\n", DEFAULT_GROUP);
|
|
||||||
group = DEFAULT_GROUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getuid () == 0)
|
|
||||||
{
|
|
||||||
printf ("\nIf home dir ends with a / then '%s' will be appended to it\n", usrname);
|
|
||||||
printf ("Home Directory [%s/%s]: ", DEFAULT_HOME, usrname);
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (dir, sizeof (dir));
|
|
||||||
if (!strlen (dir))
|
|
||||||
{ /* hit return */
|
|
||||||
sprintf (dir, "%s/%s", DEFAULT_HOME, usrname);
|
|
||||||
}
|
|
||||||
else if (dir[strlen (dir) - 1] == '/')
|
|
||||||
sprintf (dir+strlen(dir), "%s", usrname);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf ("\nHome directory will be %s/%s\n", DEFAULT_HOME, usrname);
|
|
||||||
sprintf (dir, "%s/%s", DEFAULT_HOME, usrname);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("\nShell [%s]: ", DEFAULT_SHELL);
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (shell, sizeof (shell));
|
|
||||||
if (!strlen (shell))
|
|
||||||
sprintf (shell, "%s", DEFAULT_SHELL);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char *sh;
|
|
||||||
int ok = 0;
|
|
||||||
#ifdef HAVE_GETUSERSHELL
|
|
||||||
setusershell ();
|
|
||||||
while ((sh = getusershell ()) != NULL)
|
|
||||||
if (!strcmp (shell, sh))
|
|
||||||
ok = 1;
|
|
||||||
endusershell ();
|
|
||||||
#endif
|
|
||||||
if (!ok)
|
|
||||||
{
|
|
||||||
if (getuid () == 0)
|
|
||||||
printf ("Warning: root allowed non standard shell\n");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf ("Shell NOT in /etc/shells, DEFAULT used\n");
|
|
||||||
sprintf (shell, "%s", DEFAULT_SHELL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef EXPIRE_VALS_SET
|
|
||||||
if (getuid () == 0)
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
printf ("\nMin. Password Change Days [%d]: ", DEFAULT_MIN_PASS);
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (foo, sizeof (foo));
|
|
||||||
if (strlen (foo) > 1)
|
|
||||||
min_pass = DEFAULT_MIN_PASS;
|
|
||||||
else
|
|
||||||
min_pass = atoi (foo);
|
|
||||||
|
|
||||||
printf ("Max. Password Change Days [%d]: ", DEFAULT_MAX_PASS);
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (foo, sizeof (foo));
|
|
||||||
if (strlen (foo) > 1)
|
|
||||||
max_pass = atoi (foo);
|
|
||||||
else
|
|
||||||
max_pass = DEFAULT_MAX_PASS;
|
|
||||||
|
|
||||||
printf ("Password Warning Days [%d]: ", DEFAULT_WARN_PASS);
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (foo, sizeof (foo));
|
|
||||||
warn_pass = atoi (foo);
|
|
||||||
if (warn_pass == 0)
|
|
||||||
|
|
||||||
warn_pass = DEFAULT_WARN_PASS;
|
|
||||||
|
|
||||||
printf ("Days after Password Expiry for Account Locking [%d]: ", DEFAULT_USER_DIE);
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (foo, sizeof (foo));
|
|
||||||
user_die = atoi (foo);
|
|
||||||
if (user_die == 0)
|
|
||||||
user_die = DEFAULT_USER_DIE;
|
|
||||||
|
|
||||||
#ifdef EXPIRE_VALS_SET
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf ("\nSorry, account expiry values are set.\n");
|
|
||||||
user_die = DEFAULT_USER_DIE;
|
|
||||||
warn_pass = DEFAULT_WARN_PASS;
|
|
||||||
max_pass = DEFAULT_MAX_PASS;
|
|
||||||
min_pass = DEFAULT_MIN_PASS;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
printf ("\nInformation for new user [%s] [%s]:\n", usrname, person);
|
|
||||||
printf ("Home directory: [%s] Shell: [%s]\n", dir, shell);
|
|
||||||
printf ("GID: [%d]\n", group);
|
|
||||||
printf ("MinPass: [%d] MaxPass: [%d] WarnPass: [%d] UserExpire: [%d]\n",
|
|
||||||
min_pass, max_pass, warn_pass, user_die);
|
|
||||||
printf ("\nIs this correct? [y/N]: ");
|
|
||||||
fflush (stdout);
|
|
||||||
safeget (foo, sizeof (foo));
|
|
||||||
|
|
||||||
done = bad = correct = (foo[0] == 'y' || foo[0] == 'Y');
|
|
||||||
|
|
||||||
if (bad != 1)
|
|
||||||
printf ("\nUser [%s] not added\n", usrname);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clobber the environment, I run this suid root sometimes to let
|
|
||||||
* non root privileged accounts add users --chris */
|
|
||||||
|
|
||||||
*environ = NULL;
|
|
||||||
|
|
||||||
bzero (cmd, sizeof (cmd));
|
|
||||||
sprintf (cmd, "%s -g %d -d %s -s %s -c \"%s\" -m -k /etc/skel %s",
|
|
||||||
USERADD_PATH, group, dir, shell, person, usrname);
|
|
||||||
printf ("Calling useradd to add new user:\n%s\n", cmd);
|
|
||||||
if (system (cmd))
|
|
||||||
{
|
|
||||||
printf ("User add failed!\n");
|
|
||||||
#ifdef LOGGING
|
|
||||||
syslog (LOG_ERR, "could not add new user\n");
|
|
||||||
closelog ();
|
|
||||||
#endif
|
|
||||||
exit (errno);
|
|
||||||
};
|
|
||||||
|
|
||||||
olduid = getuid (); /* chage, passwd, edquota etc. require ruid = root
|
|
||||||
*/
|
|
||||||
setuid (0);
|
|
||||||
|
|
||||||
bzero (cmd, sizeof (cmd));
|
|
||||||
|
|
||||||
/* Chage runs suid root. => we need ruid root to run it with
|
|
||||||
* anything other than chage -l
|
|
||||||
*/
|
|
||||||
|
|
||||||
sprintf (cmd, "%s -m %d -M %d -W %d -I %d %s", CHAGE_PATH,
|
|
||||||
min_pass, max_pass, warn_pass, user_die, usrname);
|
|
||||||
printf ("%s\n", cmd);
|
|
||||||
if (system (cmd))
|
|
||||||
{
|
|
||||||
printf ("There was an error setting password expire values\n");
|
|
||||||
#ifdef LOGGING
|
|
||||||
syslog (LOG_ERR, "password expire values could not be set\n");
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
/* I want to add a user completely with one easy command --chris */
|
|
||||||
|
|
||||||
#ifdef HAVE_QUOTAS
|
|
||||||
bzero (cmd, sizeof (cmd));
|
|
||||||
sprintf (cmd, "%s -p %s -u %s", EDQUOTA_PATH, QUOTA_DEFAULT, usrname);
|
|
||||||
printf ("%s\n", cmd);
|
|
||||||
if (system (cmd))
|
|
||||||
{
|
|
||||||
printf ("\nWarning: error setting quota\n");
|
|
||||||
#ifdef LOGGING
|
|
||||||
syslog (LOG_ERR, "warning: account created but NO quotas set!\n");
|
|
||||||
#endif /* LOGGING */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf ("\nDefault quota set.\n");
|
|
||||||
#endif /* HAVE_QUOTAS */
|
|
||||||
|
|
||||||
bzero (cmd, sizeof (cmd));
|
|
||||||
sprintf (cmd, "%s %s", PASSWD_PATH, usrname);
|
|
||||||
if (system (cmd))
|
|
||||||
{
|
|
||||||
printf ("\nWarning: error setting password\n");
|
|
||||||
#ifdef LOGGING
|
|
||||||
syslog (LOG_ERR, "warning: password set failed!\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef IMMEDIATE_CHANGE
|
|
||||||
bzero (cmd, sizeof (cmd));
|
|
||||||
sprintf (cmd, "%s -e %s", PASSWD_PATH, usrname);
|
|
||||||
if (system (cmd))
|
|
||||||
{
|
|
||||||
printf ("\nWarning: error expiring password\n");
|
|
||||||
#ifdef LOGGING
|
|
||||||
syslog (LOG_ERR, "warning: password expire failed!\n");
|
|
||||||
#endif /* LOGGING */
|
|
||||||
}
|
|
||||||
#endif /* IMMEDIATE_CHANGE */
|
|
||||||
|
|
||||||
setuid (olduid);
|
|
||||||
|
|
||||||
#ifdef LOGGING
|
|
||||||
closelog ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
printf ("\nDone.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
safeget (char *buf, int maxlen)
|
|
||||||
{
|
|
||||||
int c, i = 0, bad = 0;
|
|
||||||
char *bstart = buf;
|
|
||||||
while ((c = getc (stdin)) != EOF && (c != '\n') && (++i < maxlen))
|
|
||||||
{
|
|
||||||
bad = (!isalnum (c) && (c != '_') && (c != ' '));
|
|
||||||
*(buf++) = (char) c;
|
|
||||||
}
|
|
||||||
*buf = '\0';
|
|
||||||
|
|
||||||
if (bad)
|
|
||||||
{
|
|
||||||
printf ("\nString contained banned character. Please stick to alphanumerics.\n");
|
|
||||||
*bstart = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# adduser script for use with shadow passwords and useradd command.
|
|
||||||
# by Hrvoje Dogan <hdogan@student.math.hr>, Dec 1995.
|
|
||||||
|
|
||||||
echo -n "Login name for new user []:"
|
|
||||||
read LOGIN
|
|
||||||
if [ -z $LOGIN ]
|
|
||||||
then echo "Come on, man, you can't leave the login field empty...";exit
|
|
||||||
fi
|
|
||||||
echo
|
|
||||||
echo -n "User id for $LOGIN [ defaults to next available]:"
|
|
||||||
read ID
|
|
||||||
GUID="-u $ID"
|
|
||||||
if [ -z $ID ]
|
|
||||||
then GUID=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo -n "Initial group for $LOGIN [users]:"
|
|
||||||
read GID
|
|
||||||
GGID="-g $GID"
|
|
||||||
if [ -z $GID ]
|
|
||||||
then GGID=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo -n "Additional groups for $LOGIN []:"
|
|
||||||
read AGID
|
|
||||||
GAGID="-G $AGID"
|
|
||||||
if [ -z $AGID ]
|
|
||||||
then GAGID=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo -n "$LOGIN's home directory [/home/$LOGIN]:"
|
|
||||||
read HME
|
|
||||||
GHME="-d $HME"
|
|
||||||
if [ -z $HME ]
|
|
||||||
then GHME=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo -n "$LOGIN's shell [/bin/bash]:"
|
|
||||||
read SHL
|
|
||||||
GSHL="-s $SHL"
|
|
||||||
if [ -z $SHL ]
|
|
||||||
then GSHL=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo -n "$LOGIN's account expiry date (MM/DD/YY) []:"
|
|
||||||
read EXP
|
|
||||||
GEXP="-e $EXP"
|
|
||||||
if [ -z $EXP ]
|
|
||||||
then GEXP=""
|
|
||||||
fi
|
|
||||||
echo
|
|
||||||
echo OK, I'm about to make a new account. Here's what you entered so far:
|
|
||||||
echo New login name: $LOGIN
|
|
||||||
if [ -z $GUID ]
|
|
||||||
then echo New UID: [Next available]
|
|
||||||
else echo New UID: $UID
|
|
||||||
fi
|
|
||||||
if [ -z $GGID ]
|
|
||||||
then echo Initial group: users
|
|
||||||
else echo Initial group: $GID
|
|
||||||
fi
|
|
||||||
if [ -z $GAGID ]
|
|
||||||
then echo Additional groups: [none]
|
|
||||||
else echo Additional groups: $AGID
|
|
||||||
fi
|
|
||||||
if [ -z $GHME ]
|
|
||||||
then echo Home directory: /home/$LOGIN
|
|
||||||
else echo Home directory: $HME
|
|
||||||
fi
|
|
||||||
if [ -z $GSHL ]
|
|
||||||
then echo Shell: /bin/bash
|
|
||||||
else echo Shell: $SHL
|
|
||||||
fi
|
|
||||||
if [ -z $GEXP ]
|
|
||||||
then echo Expiry date: [no expiration]
|
|
||||||
else echo Expiry date: $EXP
|
|
||||||
fi
|
|
||||||
echo "This is it... if you want to bail out, you'd better do it now."
|
|
||||||
read FOO
|
|
||||||
echo Making new account...
|
|
||||||
/usr/sbin/useradd $GHME -m $GEXP $GGID $GAGID $GSHL $GUID $LOGIN
|
|
||||||
/usr/bin/chfn $LOGIN
|
|
||||||
/usr/bin/passwd $LOGIN
|
|
||||||
echo "Done..."
|
|
||||||
@@ -1,743 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# adduser Interactive user adding program.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1996 Petri Mattila, Prihateam Networks
|
|
||||||
# petri@prihateam.fi
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
#
|
|
||||||
# Changes:
|
|
||||||
# 220496 v0.01 Initial version
|
|
||||||
# 230496 v0.02 More checks, embolden summary
|
|
||||||
# 240496 Even more checks
|
|
||||||
# 250496 Help with ?
|
|
||||||
# 040596 v0.03 Cleanups
|
|
||||||
# 050596 v0.04 Bug fixes, expire date checks
|
|
||||||
# 070596 v0.05 Iso-latin-1 names
|
|
||||||
#
|
|
||||||
|
|
||||||
## Defaults
|
|
||||||
|
|
||||||
# default groups
|
|
||||||
def_group="users"
|
|
||||||
def_other_groups=""
|
|
||||||
|
|
||||||
# default home directory
|
|
||||||
def_home_dir=/home/users
|
|
||||||
|
|
||||||
# default shell
|
|
||||||
def_shell=/bin/tcsh
|
|
||||||
|
|
||||||
# Default expiration date (mm/dd/yy)
|
|
||||||
def_expire=""
|
|
||||||
|
|
||||||
# default dates
|
|
||||||
def_pwd_min=0
|
|
||||||
def_pwd_max=90
|
|
||||||
def_pwd_warn=14
|
|
||||||
def_pwd_iact=14
|
|
||||||
|
|
||||||
|
|
||||||
# possible UIDs
|
|
||||||
uid_low=1000
|
|
||||||
uid_high=64000
|
|
||||||
|
|
||||||
# skel directory
|
|
||||||
skel=/etc/skel
|
|
||||||
|
|
||||||
# default mode for home directory
|
|
||||||
def_mode=711
|
|
||||||
|
|
||||||
# Regex, that the login name must meet, only ANSI characters
|
|
||||||
login_regex='^[0-9a-zA-Z_-]*$'
|
|
||||||
|
|
||||||
# Regex, that the user name must meet
|
|
||||||
# ANSI version
|
|
||||||
##name_regex='^[0-9a-zA-Z_-\ ]*$'
|
|
||||||
# ISO-LATIN-1 version
|
|
||||||
name_regex='^[0-9a-zA-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöùúûüýþÿ_-\ ]*$'
|
|
||||||
|
|
||||||
# set PATH
|
|
||||||
export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
|
|
||||||
|
|
||||||
# Some special characters
|
|
||||||
case "$TERM" in
|
|
||||||
vt*|ansi*|con*|xterm*|linux*)
|
|
||||||
S='[1m' # start embolden
|
|
||||||
E='[m' # end embolden
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
S=''
|
|
||||||
E=''
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
## Functions
|
|
||||||
|
|
||||||
check_root() {
|
|
||||||
if test "$EUID" -ne 0
|
|
||||||
then
|
|
||||||
echo "You must be root to run this program."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
check_user() {
|
|
||||||
local usr pwd uid gid name home sh
|
|
||||||
|
|
||||||
cat /etc/passwd | (
|
|
||||||
while IFS=":" read usr pwd uid gid name home sh
|
|
||||||
do
|
|
||||||
if test "$1" = "${usr}"
|
|
||||||
then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 0
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
check_group() {
|
|
||||||
local read grp pwd gid members
|
|
||||||
|
|
||||||
cat /etc/group | (
|
|
||||||
while IFS=":" read grp pwd gid members
|
|
||||||
do
|
|
||||||
if test "$1" = "${grp}"
|
|
||||||
then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 0
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
check_other_groups() {
|
|
||||||
local grp check IFS
|
|
||||||
|
|
||||||
check="$1"
|
|
||||||
IFS=","
|
|
||||||
|
|
||||||
set ${check}
|
|
||||||
for grp
|
|
||||||
do
|
|
||||||
if check_group "${grp}"
|
|
||||||
then
|
|
||||||
echo "Group ${grp} does not exist."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
check_uid() {
|
|
||||||
local usr pwd uid gid name home sh
|
|
||||||
|
|
||||||
cat /etc/passwd | (
|
|
||||||
while IFS=":" read usr pwd uid gid name home sh
|
|
||||||
do
|
|
||||||
if test "$1" = "${uid}"
|
|
||||||
then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 0
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
read_yn() {
|
|
||||||
local ans ynd
|
|
||||||
|
|
||||||
ynd="$1"
|
|
||||||
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
read ans
|
|
||||||
case "${ans}" in
|
|
||||||
"") return ${ynd} ;;
|
|
||||||
[nN]) return 1 ;;
|
|
||||||
[yY]) return 0 ;;
|
|
||||||
*) echo -n "Y or N, please ? " ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_login() {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -n "Login: ${def_login:+[${def_login}] }"
|
|
||||||
read login
|
|
||||||
|
|
||||||
if test "${login}" = '?'
|
|
||||||
then
|
|
||||||
less /etc/passwd
|
|
||||||
echo
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "${login}" -a -n "${def_login}"
|
|
||||||
then
|
|
||||||
login="${def_login}"
|
|
||||||
echo "Using ${login}"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "${#login}" -gt 8
|
|
||||||
then
|
|
||||||
echo "Login must be at most 8 characters long"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "${#login}" -lt 2
|
|
||||||
then
|
|
||||||
echo "Login must be at least 2 characters long"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expr "${login}" : "${login_regex}" &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use letters, numbers and special characters _-,."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! check_user "${login}"
|
|
||||||
then
|
|
||||||
echo "Username ${login} is already in use"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_login="${login}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_name () {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -n "Real name: ${def_name:+[${def_name}] }"
|
|
||||||
read name
|
|
||||||
|
|
||||||
if test "${name}" = '?'
|
|
||||||
then
|
|
||||||
less /etc/passwd
|
|
||||||
echo
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "${name}" -a -n "${def_name}"
|
|
||||||
then
|
|
||||||
name="${def_name}"
|
|
||||||
echo "Using ${name}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "${#name}" -gt 32
|
|
||||||
then
|
|
||||||
echo "Name should be at most 32 characters long"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expr "${name}" : "${name_regex}" &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use letters, numbers, spaces and special characters ,._-"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_name="${name}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_home() {
|
|
||||||
local x
|
|
||||||
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -n "Home Directory: [${def_home_dir}/${login}] "
|
|
||||||
read home
|
|
||||||
|
|
||||||
if test -z "${home}"
|
|
||||||
then
|
|
||||||
home="${def_home_dir}/${login}"
|
|
||||||
echo "Using ${home}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expr "${home}" : '^[0-9a-zA-Z,._-\/]*$' &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use letters, numbers, spaces and special characters ,._-/"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
x="$(basename ${home})"
|
|
||||||
if test "${x}" != "${login}"
|
|
||||||
then
|
|
||||||
echo "Warning: you are about to use different login name and home directory."
|
|
||||||
fi
|
|
||||||
|
|
||||||
x="$(dirname ${home})"
|
|
||||||
if ! test -d "${x}"
|
|
||||||
then
|
|
||||||
echo "Directory ${x} does not exist."
|
|
||||||
echo "If you still want to use it, please make it manually."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_home_dir="${x}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_shell () {
|
|
||||||
local x
|
|
||||||
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -n "Shell: [${def_shell}] "
|
|
||||||
read shell
|
|
||||||
|
|
||||||
if test -z "${shell}"
|
|
||||||
then
|
|
||||||
shell="${def_shell}"
|
|
||||||
echo "Using ${shell}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
for x in $(cat /etc/shells)
|
|
||||||
do
|
|
||||||
if test "${x}" = "${shell}"
|
|
||||||
then
|
|
||||||
def_shell="${shell}"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Possible shells are:"
|
|
||||||
cat /etc/shells
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_group () {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -n "Group: [${def_group}] "
|
|
||||||
read group
|
|
||||||
|
|
||||||
if test -z "${group}"
|
|
||||||
then
|
|
||||||
group="${def_group}"
|
|
||||||
echo "Using ${group}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "${group}" = '?'
|
|
||||||
then
|
|
||||||
less /etc/group
|
|
||||||
echo
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if check_group "${group}"
|
|
||||||
then
|
|
||||||
echo "Group ${group} does not exist."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_group="${group}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_other_groups () {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -n "Other groups: [${def_og:-none}] "
|
|
||||||
read other_groups
|
|
||||||
|
|
||||||
if test "${other_groups}" = '?'
|
|
||||||
then
|
|
||||||
less /etc/group
|
|
||||||
echo
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "${other_groups}"
|
|
||||||
then
|
|
||||||
if test -n "${def_og}"
|
|
||||||
then
|
|
||||||
other_groups="${def_og}"
|
|
||||||
echo "Using ${other_groups}"
|
|
||||||
else
|
|
||||||
echo "No other groups"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if ! check_other_groups "${other_groups}"
|
|
||||||
then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_og="${other_groups}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_uid () {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -n "uid: [first free] "
|
|
||||||
read uid
|
|
||||||
|
|
||||||
if test -z "${uid}"
|
|
||||||
then
|
|
||||||
echo "Using first free UID."
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "${uid}" = '?'
|
|
||||||
then
|
|
||||||
less /etc/passwd
|
|
||||||
echo
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expr "${uid}" : '^[0-9]+$' &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use numbers only."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if test "${uid}" -lt "${uid_low}"
|
|
||||||
then
|
|
||||||
echo "UID must be greater than ${uid_low}"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if test "${uid}" -gt "${uid_high}"
|
|
||||||
then
|
|
||||||
echo "UID must be smaller than ${uid_high}"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if ! check_uid "${uid}"
|
|
||||||
then
|
|
||||||
echo "UID ${uid} is already in use"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_max_valid_days() {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -en "Maximum days between password changes: [${def_pwd_max}] "
|
|
||||||
read max_days
|
|
||||||
|
|
||||||
if test -z "${max_days}"
|
|
||||||
then
|
|
||||||
max_days="${def_pwd_max}"
|
|
||||||
echo "Using ${max_days}"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expr "${max_days}" : '^[0-9]+$' &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use numbers only."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if test "${max_days}" -lt 7
|
|
||||||
then
|
|
||||||
echo "Warning: you are using a value shorter than a week."
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_pwd_max="${max_days}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_min_valid_days() {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -en "Minimum days between password changes: [${def_pwd_min}] "
|
|
||||||
read min_days
|
|
||||||
|
|
||||||
if test -z "${min_days}"
|
|
||||||
then
|
|
||||||
min_days="${def_pwd_min}"
|
|
||||||
echo "Using ${min_days}"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expr "${min_days}" : '^[0-9]+$' &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use numbers only."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if test "${min_days}" -gt 7
|
|
||||||
then
|
|
||||||
echo "Warning: you are using a value longer than a week."
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_pwd_min="${min_days}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_warning_days() {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -en "Number of warning days before password expires: [${def_pwd_warn}] "
|
|
||||||
read warn_days
|
|
||||||
|
|
||||||
if test -z "${warn_days}"
|
|
||||||
then
|
|
||||||
warn_days="${def_pwd_warn}"
|
|
||||||
echo "Using ${warn_days}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expr "${warn_days}" : '^[0-9]+$' &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use numbers only."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if test "${warn_days}" -gt 14
|
|
||||||
then
|
|
||||||
echo "Warning: you are using a value longer than two week."
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_pwd_warn="${warn_days}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
read_inactive_days() {
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -en "Number of usable days after expiration: [${def_pwd_iact}] "
|
|
||||||
read iact_days
|
|
||||||
|
|
||||||
if test -z "${iact_days}"
|
|
||||||
then
|
|
||||||
iact_days="${def_pwd_iact}"
|
|
||||||
echo "Using ${iact_days}"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
if ! expr "${iact_days}" : '^[0-9]+$' &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use numbers only."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if test "${iact_days}" -gt 14
|
|
||||||
then
|
|
||||||
echo "Warning: you are using a value that is more than two weeks."
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_pwd_iact="${iact_days}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_expire_date() {
|
|
||||||
local ans
|
|
||||||
|
|
||||||
echo
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
echo -en "Expire date of this account (mm/dd/yy): [${def_expire:-never}] "
|
|
||||||
read ans
|
|
||||||
|
|
||||||
if test -z "${ans}"
|
|
||||||
then
|
|
||||||
if test -z "${def_expire}"
|
|
||||||
then
|
|
||||||
ans="never"
|
|
||||||
else
|
|
||||||
ans="${def_expire}"
|
|
||||||
echo "Using ${def_expire}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "${ans}" = "never"
|
|
||||||
then
|
|
||||||
echo "Account will never expire."
|
|
||||||
def_expire=""
|
|
||||||
expire=""
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expr "${ans}" : '^[0-9][0-9]/[0-9][0-9]/[0-9][0-9]$' &> /dev/null
|
|
||||||
then
|
|
||||||
echo "Please use format mm/dd/yy"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! expire_date="$(date -d ${ans} '+%A, %B %d %Y')"
|
|
||||||
then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
def_expire="${expire}"
|
|
||||||
return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
read_passwd_yn() {
|
|
||||||
echo -en "\nDo you want to set password [Y/n] ? "
|
|
||||||
if read_yn 0
|
|
||||||
then
|
|
||||||
set_pwd="YES"
|
|
||||||
else
|
|
||||||
set_pwd=""
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
print_values() {
|
|
||||||
|
|
||||||
clear
|
|
||||||
cat << EOM
|
|
||||||
|
|
||||||
Login: ${S}${login}${E}
|
|
||||||
Group: ${S}${group}${E}
|
|
||||||
Other groups: ${S}${other_groups:-[none]}${E}
|
|
||||||
|
|
||||||
Real Name: ${S}${name}${E}
|
|
||||||
|
|
||||||
uid: ${S}${uid:-[first free]}${E}
|
|
||||||
home: ${S}${home}${E}
|
|
||||||
shell: ${S}${shell}${E}
|
|
||||||
|
|
||||||
Account expiration date: ${S}${expire_date:-never}${E}
|
|
||||||
Minimum days between password changes: ${S}${min_days}${E}
|
|
||||||
Maximum days between password changes: ${S}${max_days}${E}
|
|
||||||
Number of usable days after expiration: ${S}${iact_days}${E}
|
|
||||||
Number of warning days before expiration: ${S}${warn_days}${E}
|
|
||||||
|
|
||||||
${S}${set_pwd:+Set password for this account.}${E}
|
|
||||||
|
|
||||||
EOM
|
|
||||||
}
|
|
||||||
|
|
||||||
set_user() {
|
|
||||||
if ! useradd \
|
|
||||||
-c "${name}" \
|
|
||||||
-d "${home}" \
|
|
||||||
-g "${group}" \
|
|
||||||
-s "${shell}" \
|
|
||||||
${expire:+-e ${expire}} \
|
|
||||||
${uid:+-u ${uid}} \
|
|
||||||
${other_groups:+-G ${other_groups}} \
|
|
||||||
${login}
|
|
||||||
then
|
|
||||||
echo "Error ($?) in useradd...exiting..."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
set_aging() {
|
|
||||||
if ! passwd \
|
|
||||||
-x ${max_days} \
|
|
||||||
-n ${min_days} \
|
|
||||||
-w ${warn_days} \
|
|
||||||
-i ${iact_days} \
|
|
||||||
${login}
|
|
||||||
then
|
|
||||||
echo "Error ($?) in setting password aging...exiting..."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
set_password() {
|
|
||||||
if test -n "${set_pwd}"
|
|
||||||
then
|
|
||||||
echo
|
|
||||||
passwd ${login}
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
set_system() {
|
|
||||||
if test -d "${home}"
|
|
||||||
then
|
|
||||||
echo "Directory ${home} already exists."
|
|
||||||
echo "Skeleton files not copied."
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -n "Copying skeleton files..."
|
|
||||||
(
|
|
||||||
mkdir ${home}
|
|
||||||
cd ${skel} && cp -af . ${home}
|
|
||||||
chmod ${def_mode} ${home}
|
|
||||||
chown -R ${login}:${group} ${home}
|
|
||||||
)
|
|
||||||
echo "done."
|
|
||||||
|
|
||||||
## Add your own stuff here:
|
|
||||||
echo -n "Setting up other files..."
|
|
||||||
(
|
|
||||||
mailbox="/var/spool/mail/${login}"
|
|
||||||
touch ${mailbox}
|
|
||||||
chown "${login}:mail" ${mailbox}
|
|
||||||
chmod 600 ${mailbox}
|
|
||||||
)
|
|
||||||
echo "done."
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
read_values() {
|
|
||||||
clear
|
|
||||||
echo -e "\nPlease answer the following questions about the new user to be added."
|
|
||||||
|
|
||||||
while :
|
|
||||||
do
|
|
||||||
read_login
|
|
||||||
read_name
|
|
||||||
read_group
|
|
||||||
read_other_groups
|
|
||||||
read_home
|
|
||||||
read_shell
|
|
||||||
read_uid
|
|
||||||
read_expire_date
|
|
||||||
read_max_valid_days
|
|
||||||
read_min_valid_days
|
|
||||||
read_warning_days
|
|
||||||
read_inactive_days
|
|
||||||
read_passwd_yn
|
|
||||||
|
|
||||||
print_values
|
|
||||||
|
|
||||||
echo -n "Is this correct [N/y] ? "
|
|
||||||
read_yn 1 && return
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
main() {
|
|
||||||
check_root
|
|
||||||
read_values
|
|
||||||
set_user
|
|
||||||
set_aging
|
|
||||||
set_system
|
|
||||||
set_password
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
## Run it 8-)
|
|
||||||
main
|
|
||||||
|
|
||||||
# End.
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
#!/usr/bin/perl
|
|
||||||
#
|
|
||||||
# Copyright (c) 1996 Brian R. Gaeke
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions
|
|
||||||
# are met:
|
|
||||||
# 1. Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# 2. Redistributions in binary form must reproduce 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 Brian R. Gaeke.
|
|
||||||
# 4. The name of the author, Brian R. Gaeke, may not be used to endorse
|
|
||||||
# or promote products derived from this software without specific
|
|
||||||
# prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY BRIAN R. GAEKE ``AS IS'' AND ANY EXPRESS
|
|
||||||
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
# DISCLAIMED. IN NO EVENT SHALL BRIAN R. GAEKE BE LIABLE FOR ANY DIRECT,
|
|
||||||
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
||||||
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
# Additionally:
|
|
||||||
#
|
|
||||||
# This software is provided without support and without any obligation
|
|
||||||
# on the part of Brian R. Gaeke to assist in its use, correction,
|
|
||||||
# modification or enhancement.
|
|
||||||
#
|
|
||||||
#######################################################################
|
|
||||||
#
|
|
||||||
# this is atudel, version 2, by Brian R. Gaeke <brg@dgate.org>
|
|
||||||
#
|
|
||||||
|
|
||||||
require "getopts.pl";
|
|
||||||
&Getopts('v');
|
|
||||||
$username = shift(@ARGV);
|
|
||||||
&usage unless $username;
|
|
||||||
|
|
||||||
sub usage
|
|
||||||
{
|
|
||||||
print STDERR "atudel - remove all at jobs owned by a user\n";
|
|
||||||
print STDERR "usage: $0 [-v] username\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
# odd. unless getpwnam($uname) doesn't seem to work for $uname eq "root" on
|
|
||||||
# my linux system. but this does.
|
|
||||||
die "user $username does not exist; stopping"
|
|
||||||
unless defined(getpwnam($username));
|
|
||||||
|
|
||||||
print "searching for at jobs owned by user $username ..." if $opt_v;
|
|
||||||
|
|
||||||
chdir "/var/spool/atjobs" ||
|
|
||||||
die "can't chdir to /var/spool/atjobs: $!\nstopping";
|
|
||||||
opendir(DIR,".") || die "can't opendir(/var/spool/atjobs): $!\nstopping";
|
|
||||||
@files = grep(!/^\./,grep(-f,readdir(DIR)));
|
|
||||||
closedir DIR;
|
|
||||||
|
|
||||||
foreach $x (@files)
|
|
||||||
{
|
|
||||||
$owner = (getpwuid((stat($x))[4]))[0];
|
|
||||||
push(@nuke_bait,$x) if $owner eq $username;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (@nuke_bait)
|
|
||||||
{
|
|
||||||
print "removed jobIDs: @{nuke_bait}.\n" if $opt_v;
|
|
||||||
unlink @nuke_bait;
|
|
||||||
}
|
|
||||||
elsif ($opt_v)
|
|
||||||
{
|
|
||||||
print "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
exit 0;
|
|
||||||
@@ -1,546 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# This is a shell archive (produced by GNU sharutils 4.2.1).
|
|
||||||
# To extract the files from this archive, save it to some FILE, remove
|
|
||||||
# everything before the `!/bin/sh' line above, then type `sh FILE'.
|
|
||||||
#
|
|
||||||
# Made on 2000-05-25 14:41 CDT by <gk4@gnu.austin.ibm.com>.
|
|
||||||
# Source directory was `/home/gk4/src/groupmem'.
|
|
||||||
#
|
|
||||||
# Existing files will *not* be overwritten unless `-c' is specified.
|
|
||||||
#
|
|
||||||
# This shar contains:
|
|
||||||
# length mode name
|
|
||||||
# ------ ---------- ------------------------------------------
|
|
||||||
# 1960 -rw-r--r-- Makefile
|
|
||||||
# 6348 -rw-r--r-- groupmems.c
|
|
||||||
# 3372 -rw------- groupmems.8
|
|
||||||
#
|
|
||||||
save_IFS="${IFS}"
|
|
||||||
IFS="${IFS}:"
|
|
||||||
gettext_dir=FAILED
|
|
||||||
locale_dir=FAILED
|
|
||||||
first_param="$1"
|
|
||||||
for dir in $PATH
|
|
||||||
do
|
|
||||||
if test "$gettext_dir" = FAILED && test -f $dir/gettext \
|
|
||||||
&& ($dir/gettext --version >/dev/null 2>&1)
|
|
||||||
then
|
|
||||||
set `$dir/gettext --version 2>&1`
|
|
||||||
if test "$3" = GNU
|
|
||||||
then
|
|
||||||
gettext_dir=$dir
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$locale_dir" = FAILED && test -f $dir/shar \
|
|
||||||
&& ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
|
|
||||||
then
|
|
||||||
locale_dir=`$dir/shar --print-text-domain-dir`
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$save_IFS"
|
|
||||||
if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
|
|
||||||
then
|
|
||||||
echo=echo
|
|
||||||
else
|
|
||||||
TEXTDOMAINDIR=$locale_dir
|
|
||||||
export TEXTDOMAINDIR
|
|
||||||
TEXTDOMAIN=sharutils
|
|
||||||
export TEXTDOMAIN
|
|
||||||
echo="$gettext_dir/gettext -s"
|
|
||||||
fi
|
|
||||||
if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then
|
|
||||||
shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"'
|
|
||||||
elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then
|
|
||||||
shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"'
|
|
||||||
elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then
|
|
||||||
shar_touch='touch -am $3$4$5$6$2 "$8"'
|
|
||||||
else
|
|
||||||
shar_touch=:
|
|
||||||
echo
|
|
||||||
$echo 'WARNING: not restoring timestamps. Consider getting and'
|
|
||||||
$echo "installing GNU \`touch', distributed in GNU File Utilities..."
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch
|
|
||||||
#
|
|
||||||
if mkdir _sh10937; then
|
|
||||||
$echo 'x -' 'creating lock directory'
|
|
||||||
else
|
|
||||||
$echo 'failed to create lock directory'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# ============= Makefile ==============
|
|
||||||
if test -f 'Makefile' && test "$first_param" != -c; then
|
|
||||||
$echo 'x -' SKIPPING 'Makefile' '(file already exists)'
|
|
||||||
else
|
|
||||||
$echo 'x -' extracting 'Makefile' '(text)'
|
|
||||||
sed 's/^X//' << 'SHAR_EOF' > 'Makefile' &&
|
|
||||||
/*
|
|
||||||
# Copyright 2000, International Business Machines, Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# original author: George Kraft IV, gk4@us.ibm.com
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions
|
|
||||||
# are met:
|
|
||||||
#
|
|
||||||
# 1. Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution.
|
|
||||||
# 3. Neither the name of International Business Machines, Inc., nor the
|
|
||||||
# names of its contributors may be used to endorse or promote products
|
|
||||||
# derived from this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY INTERNATIONAL BUSINESS MACHINES, 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
|
|
||||||
# INTERNATIONAL BUSINESS MACHINES, INC. OR CONTRIBUTORS BE LIABLE
|
|
||||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
# SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
X
|
|
||||||
all: groupmems
|
|
||||||
X
|
|
||||||
groupmems: groupmems.c
|
|
||||||
X cc -g -o groupmems groupmems.c -L. -lshadow
|
|
||||||
X
|
|
||||||
install: groupmems
|
|
||||||
X -/usr/sbin/groupadd groups
|
|
||||||
X install -o root -g groups -m 4770 groupmems /usr/bin
|
|
||||||
X
|
|
||||||
install.man: groupmems.8
|
|
||||||
X install -o root -g root -m 644 groupmems.8 /usr/man/man8
|
|
||||||
X
|
|
||||||
SHAR_EOF
|
|
||||||
(set 20 00 05 25 14 40 28 'Makefile'; eval "$shar_touch") &&
|
|
||||||
chmod 0644 'Makefile' ||
|
|
||||||
$echo 'restore of' 'Makefile' 'failed'
|
|
||||||
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
|
|
||||||
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
|
|
||||||
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|
|
||||||
|| $echo 'Makefile:' 'MD5 check failed'
|
|
||||||
b46cf7ef8d59149093c011ced3f3103c Makefile
|
|
||||||
SHAR_EOF
|
|
||||||
else
|
|
||||||
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'Makefile'`"
|
|
||||||
test 1960 -eq "$shar_count" ||
|
|
||||||
$echo 'Makefile:' 'original size' '1960,' 'current size' "$shar_count!"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# ============= groupmems.c ==============
|
|
||||||
if test -f 'groupmems.c' && test "$first_param" != -c; then
|
|
||||||
$echo 'x -' SKIPPING 'groupmems.c' '(file already exists)'
|
|
||||||
else
|
|
||||||
$echo 'x -' extracting 'groupmems.c' '(text)'
|
|
||||||
sed 's/^X//' << 'SHAR_EOF' > 'groupmems.c' &&
|
|
||||||
/*
|
|
||||||
X * Copyright 2000, International Business Machines, Inc.
|
|
||||||
X * All rights reserved.
|
|
||||||
X *
|
|
||||||
X * original author: George Kraft IV, gk4@us.ibm.com
|
|
||||||
X *
|
|
||||||
X * Redistribution and use in source and binary forms, with or without
|
|
||||||
X * modification, are permitted provided that the following conditions
|
|
||||||
X * are met:
|
|
||||||
X *
|
|
||||||
X * 1. Redistributions of source code must retain the above copyright
|
|
||||||
X * notice, this list of conditions and the following disclaimer.
|
|
||||||
X * 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
X * notice, this list of conditions and the following disclaimer in the
|
|
||||||
X * documentation and/or other materials provided with the distribution.
|
|
||||||
X * 3. Neither the name of International Business Machines, Inc., nor the
|
|
||||||
X * names of its contributors may be used to endorse or promote products
|
|
||||||
X * derived from this software without specific prior written permission.
|
|
||||||
X *
|
|
||||||
X * THIS SOFTWARE IS PROVIDED BY INTERNATIONAL BUSINESS MACHINES, INC. AND
|
|
||||||
X * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
|
||||||
X * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
X * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
X * INTERNATIONAL BUSINESS MACHINES, INC. OR CONTRIBUTORS BE LIABLE
|
|
||||||
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
X * SUCH DAMAGE.
|
|
||||||
X */
|
|
||||||
/*
|
|
||||||
**
|
|
||||||
** Utility "groupmem" adds and deletes members from a user's group.
|
|
||||||
**
|
|
||||||
** Setup (as "root"):
|
|
||||||
**
|
|
||||||
** groupadd -r groups
|
|
||||||
** chmod 2770 groupmems
|
|
||||||
** chown root.groups groupmems
|
|
||||||
** groupmems -g groups -a gk4
|
|
||||||
**
|
|
||||||
** Usage (as "gk4"):
|
|
||||||
**
|
|
||||||
** groupmems -a olive
|
|
||||||
** groupmems -a jordan
|
|
||||||
** groupmems -a meghan
|
|
||||||
** groupmems -a morgan
|
|
||||||
** groupmems -a jake
|
|
||||||
** groupmems -l
|
|
||||||
** groupmems -d jake
|
|
||||||
** groupmems -l
|
|
||||||
*/
|
|
||||||
X
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <grp.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include "defines.h"
|
|
||||||
#include "groupio.h"
|
|
||||||
X
|
|
||||||
/* Exit Status Values */
|
|
||||||
X
|
|
||||||
#define EXIT_SUCCESS 0 /* success */
|
|
||||||
#define EXIT_USAGE 1 /* invalid command syntax */
|
|
||||||
#define EXIT_GROUP_FILE 2 /* group file access problems */
|
|
||||||
#define EXIT_NOT_ROOT 3 /* not superuser */
|
|
||||||
#define EXIT_NOT_EROOT 4 /* not effective superuser */
|
|
||||||
#define EXIT_NOT_PRIMARY 5 /* not primary owner of group */
|
|
||||||
#define EXIT_NOT_MEMBER 6 /* member of group does not exist */
|
|
||||||
#define EXIT_MEMBER_EXISTS 7 /* member of group already exists */
|
|
||||||
X
|
|
||||||
#define TRUE 1
|
|
||||||
#define FALSE 0
|
|
||||||
X
|
|
||||||
/* Globals */
|
|
||||||
X
|
|
||||||
extern int optind;
|
|
||||||
extern char *optarg;
|
|
||||||
static char *adduser = NULL;
|
|
||||||
static char *deluser = NULL;
|
|
||||||
static char *thisgroup = NULL;
|
|
||||||
static int purge = FALSE;
|
|
||||||
static int list = FALSE;
|
|
||||||
static int exclusive = 0;
|
|
||||||
X
|
|
||||||
static int isroot(void) {
|
|
||||||
X return getuid() ? FALSE : TRUE;
|
|
||||||
}
|
|
||||||
X
|
|
||||||
static int isgroup(void) {
|
|
||||||
X gid_t g = getgid();
|
|
||||||
X struct group *grp = getgrgid(g);
|
|
||||||
X
|
|
||||||
X return TRUE;
|
|
||||||
}
|
|
||||||
X
|
|
||||||
static char *whoami(void) {
|
|
||||||
X struct group *grp = getgrgid(getgid());
|
|
||||||
X struct passwd *usr = getpwuid(getuid());
|
|
||||||
X
|
|
||||||
X if (0 == strcmp(usr->pw_name, grp->gr_name)) {
|
|
||||||
X return (char *)strdup(usr->pw_name);
|
|
||||||
X } else {
|
|
||||||
X return NULL;
|
|
||||||
X }
|
|
||||||
}
|
|
||||||
X
|
|
||||||
static void
|
|
||||||
addtogroup(char *user, char **members) {
|
|
||||||
X int i;
|
|
||||||
X char **pmembers;
|
|
||||||
X
|
|
||||||
X for (i = 0; NULL != members[i]; i++ ) {
|
|
||||||
X if (0 == strcmp(user, members[i])) {
|
|
||||||
X fprintf(stderr, "Member already exists\n");
|
|
||||||
X exit(EXIT_MEMBER_EXISTS);
|
|
||||||
X }
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X if (0 == i) {
|
|
||||||
X pmembers = (char **)calloc(2, sizeof(char *));
|
|
||||||
X } else {
|
|
||||||
X pmembers = (char **)realloc(members, sizeof(char *)*(i+1));
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X *members = *pmembers;
|
|
||||||
X members[i] = user;
|
|
||||||
X members[i+1] = NULL;
|
|
||||||
}
|
|
||||||
X
|
|
||||||
static void
|
|
||||||
rmfromgroup(char *user, char **members) {
|
|
||||||
X int i;
|
|
||||||
X int found = FALSE;
|
|
||||||
X
|
|
||||||
X i = 0;
|
|
||||||
X while (!found && NULL != members[i]) {
|
|
||||||
X if (0 == strcmp(user, members[i])) {
|
|
||||||
X found = TRUE;
|
|
||||||
X } else {
|
|
||||||
X i++;
|
|
||||||
X }
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X while (found && NULL != members[i]) {
|
|
||||||
X members[i] = members[++i];
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X if (!found) {
|
|
||||||
X fprintf(stderr, "Member to remove could not be found\n");
|
|
||||||
X exit(EXIT_NOT_MEMBER);
|
|
||||||
X }
|
|
||||||
}
|
|
||||||
X
|
|
||||||
static void
|
|
||||||
nomembers(char **members) {
|
|
||||||
X int i;
|
|
||||||
X
|
|
||||||
X for (i = 0; NULL != members[i]; i++ ) {
|
|
||||||
X members[i] = NULL;
|
|
||||||
X }
|
|
||||||
}
|
|
||||||
X
|
|
||||||
static void
|
|
||||||
members(char **members) {
|
|
||||||
X int i;
|
|
||||||
X
|
|
||||||
X for (i = 0; NULL != members[i]; i++ ) {
|
|
||||||
X printf("%s ", members[i]);
|
|
||||||
X
|
|
||||||
X if (NULL == members[i+1]) {
|
|
||||||
X printf("\n");
|
|
||||||
X } else {
|
|
||||||
X printf(" ");
|
|
||||||
X }
|
|
||||||
X }
|
|
||||||
}
|
|
||||||
X
|
|
||||||
static void usage(void) {
|
|
||||||
X fprintf(stderr, "usage: groupmems -a username | -d username | -D | -l [-g groupname]\n");
|
|
||||||
X exit(EXIT_USAGE);
|
|
||||||
}
|
|
||||||
X
|
|
||||||
main(int argc, char **argv) {
|
|
||||||
X int arg, i;
|
|
||||||
X char *name;
|
|
||||||
X struct group *grp;
|
|
||||||
X
|
|
||||||
X while ((arg = getopt(argc, argv, "a:d:g:Dl")) != EOF) {
|
|
||||||
X switch (arg) {
|
|
||||||
X case 'a':
|
|
||||||
X adduser = strdup(optarg);
|
|
||||||
X ++exclusive;
|
|
||||||
X break;
|
|
||||||
X case 'd':
|
|
||||||
X deluser = strdup(optarg);
|
|
||||||
X ++exclusive;
|
|
||||||
X break;
|
|
||||||
X case 'g':
|
|
||||||
X thisgroup = strdup(optarg);
|
|
||||||
X break;
|
|
||||||
X case 'D':
|
|
||||||
X purge = TRUE;
|
|
||||||
X ++exclusive;
|
|
||||||
X break;
|
|
||||||
X case 'l':
|
|
||||||
X list = TRUE;
|
|
||||||
X ++exclusive;
|
|
||||||
X break;
|
|
||||||
X default:
|
|
||||||
X usage();
|
|
||||||
X }
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X if (exclusive > 1 || optind < argc) {
|
|
||||||
X usage();
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X if (!isroot() && NULL != thisgroup) {
|
|
||||||
X fprintf(stderr, "Only root can add members to different groups\n");
|
|
||||||
X exit(EXIT_NOT_ROOT);
|
|
||||||
X } else if (isroot() && NULL != thisgroup) {
|
|
||||||
X name = thisgroup;
|
|
||||||
X } else if (!isgroup()) {
|
|
||||||
X fprintf(stderr, "Group access is required\n");
|
|
||||||
X exit(EXIT_NOT_EROOT);
|
|
||||||
X } else if (NULL == (name = whoami())) {
|
|
||||||
X fprintf(stderr, "Not primary owner of current group\n");
|
|
||||||
X exit(EXIT_NOT_PRIMARY);
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X if (!gr_lock()) {
|
|
||||||
X fprintf(stderr, "Unable to lock group file\n");
|
|
||||||
X exit(EXIT_GROUP_FILE);
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X if (!gr_open(O_RDWR)) {
|
|
||||||
X fprintf(stderr, "Unable to open group file\n");
|
|
||||||
X exit(EXIT_GROUP_FILE);
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X grp = (struct group *)gr_locate(name);
|
|
||||||
X
|
|
||||||
X if (NULL != adduser) {
|
|
||||||
X addtogroup(adduser, grp->gr_mem);
|
|
||||||
X gr_update(grp);
|
|
||||||
X } else if (NULL != deluser) {
|
|
||||||
X rmfromgroup(deluser, grp->gr_mem);
|
|
||||||
X gr_update(grp);
|
|
||||||
X } else if (purge) {
|
|
||||||
X nomembers(grp->gr_mem);
|
|
||||||
X gr_update(grp);
|
|
||||||
X } else if (list) {
|
|
||||||
X members(grp->gr_mem);
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X if (!gr_close()) {
|
|
||||||
X fprintf(stderr, "Cannot close group file\n");
|
|
||||||
X exit(EXIT_GROUP_FILE);
|
|
||||||
X }
|
|
||||||
X
|
|
||||||
X gr_unlock();
|
|
||||||
X
|
|
||||||
X exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
X
|
|
||||||
/* EOF */
|
|
||||||
SHAR_EOF
|
|
||||||
(set 20 00 05 25 14 36 38 'groupmems.c'; eval "$shar_touch") &&
|
|
||||||
chmod 0644 'groupmems.c' ||
|
|
||||||
$echo 'restore of' 'groupmems.c' 'failed'
|
|
||||||
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
|
|
||||||
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
|
|
||||||
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|
|
||||||
|| $echo 'groupmems.c:' 'MD5 check failed'
|
|
||||||
f0dd68f8d762d89d24d3ce1f4141f981 groupmems.c
|
|
||||||
SHAR_EOF
|
|
||||||
else
|
|
||||||
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'groupmems.c'`"
|
|
||||||
test 6348 -eq "$shar_count" ||
|
|
||||||
$echo 'groupmems.c:' 'original size' '6348,' 'current size' "$shar_count!"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# ============= groupmems.8 ==============
|
|
||||||
if test -f 'groupmems.8' && test "$first_param" != -c; then
|
|
||||||
$echo 'x -' SKIPPING 'groupmems.8' '(file already exists)'
|
|
||||||
else
|
|
||||||
$echo 'x -' extracting 'groupmems.8' '(text)'
|
|
||||||
sed 's/^X//' << 'SHAR_EOF' > 'groupmems.8' &&
|
|
||||||
X.\"
|
|
||||||
X.\" Copyright 2000, International Business Machines, Inc.
|
|
||||||
X.\" All rights reserved.
|
|
||||||
X.\"
|
|
||||||
X.\" original author: George Kraft IV, gk4@us.ibm.com
|
|
||||||
X.\"
|
|
||||||
X.\" Redistribution and use in source and binary forms, with or without
|
|
||||||
X.\" modification, are permitted provided that the following conditions
|
|
||||||
X.\" are met:
|
|
||||||
X.\"
|
|
||||||
X.\" 1. Redistributions of source code must retain the above copyright
|
|
||||||
X.\" notice, this list of conditions and the following disclaimer.
|
|
||||||
X.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
X.\" notice, this list of conditions and the following disclaimer in the
|
|
||||||
X.\" documentation and/or other materials provided with the distribution.
|
|
||||||
X.\" 3. Neither the name of International Business Machines, Inc., nor the
|
|
||||||
X.\" names of its contributors may be used to endorse or promote products
|
|
||||||
X.\" derived from this software without specific prior written permission.
|
|
||||||
X.\"
|
|
||||||
X.\" THIS SOFTWARE IS PROVIDED BY INTERNATIONAL BUSINESS MACHINES, INC. AND
|
|
||||||
X.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
|
|
||||||
X.\" BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
X.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
X.\" INTERNATIONAL BUSINESS MACHINES, INC. OR CONTRIBUTORS BE LIABLE
|
|
||||||
X.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
X.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
X.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
X.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
X.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
X.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
X.\" SUCH DAMAGE.
|
|
||||||
X.\"
|
|
||||||
X.\" $Id$
|
|
||||||
X.\"
|
|
||||||
X.TH GROUPMEMS 8
|
|
||||||
X.SH NAME
|
|
||||||
groupmems \- Administer members of a user's primary group
|
|
||||||
X.SH SYNOPSIS
|
|
||||||
X.B groupmems
|
|
||||||
\fB-a\fI user_name \fR |
|
|
||||||
\fB-d\fI user_name \fR |
|
|
||||||
\fB-l\fR |
|
|
||||||
\fB-D\fR |
|
|
||||||
[\fB-g\fI group_name \fR]
|
|
||||||
X.SH DESCRIPTION
|
|
||||||
The \fBgroupmems\fR utility allows a user to administer their own
|
|
||||||
group membership list without the requirement of superuser privileges.
|
|
||||||
The \fBgroupmems\fR utility is for systems that configure its users to
|
|
||||||
be in their own name sake primary group (i.e., guest / guest).
|
|
||||||
X.P
|
|
||||||
Only the superuser, as administrator, can use \fBgroupmems\fR to alter
|
|
||||||
the memberships of other groups.
|
|
||||||
X.IP "\fB-a \fIuser_name\fR"
|
|
||||||
Add a new user to the group membership list.
|
|
||||||
X.IP "\fB-d \fIuser_name\fR"
|
|
||||||
Delete a user from the group membership list.
|
|
||||||
X.IP "\fB-l\fR"
|
|
||||||
List the group membership list.
|
|
||||||
X.IP "\fB-D\fR"
|
|
||||||
Delete all users from the group membership list.
|
|
||||||
X.IP "\fB-g \fIgroup_name\fR"
|
|
||||||
The superuser can specify which group membership list to modify.
|
|
||||||
X.SH SETUP
|
|
||||||
The \fBgroupmems\fR executable should be in mode \fB2770\fR as user \fBroot\fR
|
|
||||||
and in group \fBgroups\fR. The system administrator can add users to
|
|
||||||
group groups to allow or disallow them using the \fBgroupmems\fR utility
|
|
||||||
to manager their own group membership list.
|
|
||||||
X.P
|
|
||||||
X $ groupadd -r groups
|
|
||||||
X.br
|
|
||||||
X $ chmod 2770 groupmems
|
|
||||||
X.br
|
|
||||||
X $ chown root.groups groupmems
|
|
||||||
X.br
|
|
||||||
X $ groupmems -g groups -a gk4
|
|
||||||
X.SH FILES
|
|
||||||
/etc/group
|
|
||||||
X.br
|
|
||||||
/etc/gshadow
|
|
||||||
X.SH SEE ALSO
|
|
||||||
X.BR chfn (1),
|
|
||||||
X.BR chsh (1),
|
|
||||||
X.BR useradd (8),
|
|
||||||
X.BR userdel (8),
|
|
||||||
X.BR usermod (8),
|
|
||||||
X.BR passwd (1),
|
|
||||||
X.BR groupadd (8),
|
|
||||||
X.BR groupdel (8)
|
|
||||||
X.SH AUTHOR
|
|
||||||
George Kraft IV (gk4@us.ibm.com)
|
|
||||||
X.\" EOF
|
|
||||||
SHAR_EOF
|
|
||||||
(set 20 00 05 25 14 38 23 'groupmems.8'; eval "$shar_touch") &&
|
|
||||||
chmod 0600 'groupmems.8' ||
|
|
||||||
$echo 'restore of' 'groupmems.8' 'failed'
|
|
||||||
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
|
|
||||||
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
|
|
||||||
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|
|
||||||
|| $echo 'groupmems.8:' 'MD5 check failed'
|
|
||||||
181e6cd3a3c9d3df320197fa2cde2b4a groupmems.8
|
|
||||||
SHAR_EOF
|
|
||||||
else
|
|
||||||
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'groupmems.8'`"
|
|
||||||
test 3372 -eq "$shar_count" ||
|
|
||||||
$echo 'groupmems.8:' 'original size' '3372,' 'current size' "$shar_count!"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
rm -fr _sh10937
|
|
||||||
exit 0
|
|
||||||
@@ -1,308 +0,0 @@
|
|||||||
/*
|
|
||||||
* pwdauth.c - program to verify a given username/password pair.
|
|
||||||
*
|
|
||||||
* Run it with username in argv[1] (may be omitted - default is the
|
|
||||||
* current user), and send it the password over a pipe on stdin.
|
|
||||||
* Exit status: 0 - correct password, 1 - wrong password, >1 - other
|
|
||||||
* errors. For use with shadow passwords, this program should be
|
|
||||||
* installed setuid root.
|
|
||||||
*
|
|
||||||
* This can be used, for example, by xlock - you don't have to install
|
|
||||||
* this large and complex (== possibly insecure) program setuid root,
|
|
||||||
* just modify it to run this simple program to do the authentication.
|
|
||||||
*
|
|
||||||
* Recent versions (xlockmore-3.9) are cleaner, and drop privileges as
|
|
||||||
* soon as possible after getting the user's encrypted password.
|
|
||||||
* Using this program probably doesn't make it more secure, and has one
|
|
||||||
* disadvantage: since we don't get the encrypted user's password at
|
|
||||||
* startup (but at the time the user is authenticated), it is not clear
|
|
||||||
* how we should handle errors (like getpwnam() returning NULL).
|
|
||||||
* - fail the authentication? Problem: no way to unlock (other than kill
|
|
||||||
* the process from somewhere else) if the NIS server stops responding.
|
|
||||||
* - succeed and unlock? Problem: it's too easy to unlock by unplugging
|
|
||||||
* the box from the network and waiting until NIS times out...
|
|
||||||
*
|
|
||||||
* This program is Copyright (C) 1996 Marek Michalkiewicz
|
|
||||||
* <marekm@i17linuxb.ists.pwr.wroc.pl>.
|
|
||||||
*
|
|
||||||
* It may be used and distributed freely for any purposes. There is no
|
|
||||||
* warranty - use at your own risk. I am not liable for any damages etc.
|
|
||||||
* If you improve it, please send me your changes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static char rcsid[] = "$Id$";
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define USE_SYSLOG to use syslog() to log successful and failed
|
|
||||||
* authentication. This should be safe even if your system has
|
|
||||||
* the infamous syslog buffer overrun security problem...
|
|
||||||
*/
|
|
||||||
#define USE_SYSLOG
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define HAVE_GETSPNAM to get shadow passwords using getspnam().
|
|
||||||
* Some systems don't have getspnam(), but getpwnam() returns
|
|
||||||
* encrypted passwords only if running as root.
|
|
||||||
*
|
|
||||||
* According to the xlock source (not tested, except Linux) -
|
|
||||||
* define: Linux, Solaris 2.x, SVR4, ...
|
|
||||||
* undef: HP-UX with Secured Passwords, FreeBSD, NetBSD, QNX.
|
|
||||||
* Known not supported (yet): Ultrix, OSF/1, SCO.
|
|
||||||
*/
|
|
||||||
#define HAVE_GETSPNAM
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define HAVE_PW_ENCRYPT to use pw_encrypt() instead of crypt().
|
|
||||||
* pw_encrypt() is like the standard crypt(), except that it may
|
|
||||||
* support better password hashing algorithms.
|
|
||||||
*
|
|
||||||
* Define if linking with libshadow.a from the shadow password
|
|
||||||
* suite (Linux, SunOS 4.x?).
|
|
||||||
*/
|
|
||||||
#undef HAVE_PW_ENCRYPT
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define HAVE_AUTH_METHODS to support the shadow suite specific
|
|
||||||
* extension: the encrypted password field contains a list of
|
|
||||||
* administrator defined authentication methods, separated by
|
|
||||||
* semicolons. This program only supports the standard password
|
|
||||||
* authentication method (a string that doesn't start with '@').
|
|
||||||
*/
|
|
||||||
#undef HAVE_AUTH_METHODS
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FAIL_DELAY - number of seconds to sleep before exiting if the
|
|
||||||
* password was wrong, to slow down password guessing attempts.
|
|
||||||
*/
|
|
||||||
#define FAIL_DELAY 2
|
|
||||||
|
|
||||||
/* No user-serviceable parts below :-). */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
|
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
#include <syslog.h>
|
|
||||||
#ifndef LOG_AUTHPRIV
|
|
||||||
#define LOG_AUTHPRIV LOG_AUTH
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_GETSPNAM
|
|
||||||
#include <shadow.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PW_ENCRYPT
|
|
||||||
extern char *pw_encrypt();
|
|
||||||
#define crypt pw_encrypt
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the password (one line) from fp. We don't turn off echo
|
|
||||||
* because we expect input from a pipe.
|
|
||||||
*/
|
|
||||||
static char *
|
|
||||||
get_line(fp)
|
|
||||||
FILE *fp;
|
|
||||||
{
|
|
||||||
static char buf[128];
|
|
||||||
char *cp;
|
|
||||||
int ch;
|
|
||||||
|
|
||||||
cp = buf;
|
|
||||||
while ((ch = getc(fp)) != EOF && ch != '\0' && ch != '\n') {
|
|
||||||
if (cp >= buf + sizeof buf - 1)
|
|
||||||
break;
|
|
||||||
*cp++ = ch;
|
|
||||||
}
|
|
||||||
*cp = '\0';
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the password file entry for the current user. If the name
|
|
||||||
* returned by getlogin() is correct (matches the current real uid),
|
|
||||||
* return the entry for that user. Otherwise, return the entry (if
|
|
||||||
* any) matching the current real uid. Return NULL on failure.
|
|
||||||
*/
|
|
||||||
static struct passwd *
|
|
||||||
get_my_pwent()
|
|
||||||
{
|
|
||||||
uid_t uid = getuid();
|
|
||||||
char *name = getlogin();
|
|
||||||
|
|
||||||
if (name && *name) {
|
|
||||||
struct passwd *pw = getpwnam(name);
|
|
||||||
|
|
||||||
if (pw && pw->pw_uid == uid)
|
|
||||||
return pw;
|
|
||||||
}
|
|
||||||
return getpwuid(uid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Verify the password. The system-dependent shadow support is here.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
password_auth_ok(pw, pass)
|
|
||||||
const struct passwd *pw;
|
|
||||||
const char *pass;
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
char *cp;
|
|
||||||
#ifdef HAVE_AUTH_METHODS
|
|
||||||
char *buf;
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_GETSPNAM
|
|
||||||
struct spwd *sp;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (pw) {
|
|
||||||
#ifdef HAVE_GETSPNAM
|
|
||||||
sp = getspnam(pw->pw_name);
|
|
||||||
if (sp)
|
|
||||||
cp = sp->sp_pwdp;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
cp = pw->pw_passwd;
|
|
||||||
} else
|
|
||||||
cp = "xx";
|
|
||||||
|
|
||||||
#ifdef HAVE_AUTH_METHODS
|
|
||||||
buf = strdup(cp); /* will be modified by strtok() */
|
|
||||||
if (!buf) {
|
|
||||||
fprintf(stderr, "Out of memory.\n");
|
|
||||||
exit(13);
|
|
||||||
}
|
|
||||||
cp = strtok(buf, ";");
|
|
||||||
while (cp && *cp == '@')
|
|
||||||
cp = strtok(NULL, ";");
|
|
||||||
|
|
||||||
/* fail if no password authentication for this user */
|
|
||||||
if (!cp)
|
|
||||||
cp = "xx";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (*pass || *cp)
|
|
||||||
result = (strcmp(crypt(pass, cp), cp) == 0);
|
|
||||||
else
|
|
||||||
result = 1; /* user with no password */
|
|
||||||
|
|
||||||
#ifdef HAVE_AUTH_METHODS
|
|
||||||
free(buf);
|
|
||||||
#endif
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Main program.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
main(argc, argv)
|
|
||||||
int argc;
|
|
||||||
char **argv;
|
|
||||||
{
|
|
||||||
struct passwd *pw;
|
|
||||||
char *pass, *name;
|
|
||||||
char myname[32];
|
|
||||||
|
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
openlog("pwdauth", LOG_PID | LOG_CONS, LOG_AUTHPRIV);
|
|
||||||
#endif
|
|
||||||
pw = get_my_pwent();
|
|
||||||
if (!pw) {
|
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
syslog(LOG_ERR, "can't get login name for uid %d.\n",
|
|
||||||
(int) getuid());
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, "Who are you?\n");
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
strncpy(myname, pw->pw_name, sizeof myname - 1);
|
|
||||||
myname[sizeof myname - 1] = '\0';
|
|
||||||
name = myname;
|
|
||||||
|
|
||||||
if (argc > 1) {
|
|
||||||
name = argv[1];
|
|
||||||
pw = getpwnam(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
pass = get_line(stdin);
|
|
||||||
if (password_auth_ok(pw, pass)) {
|
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
syslog(pw->pw_uid ? LOG_INFO : LOG_NOTICE,
|
|
||||||
"user `%s' entered correct password for `%.32s'.\n",
|
|
||||||
myname, name);
|
|
||||||
#endif
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
/* be careful not to overrun the syslog buffer */
|
|
||||||
syslog((!pw || pw->pw_uid) ? LOG_NOTICE : LOG_WARNING,
|
|
||||||
"user `%s' entered incorrect password for `%.32s'.\n",
|
|
||||||
myname, name);
|
|
||||||
#endif
|
|
||||||
#ifdef FAIL_DELAY
|
|
||||||
sleep(FAIL_DELAY);
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, "Wrong password.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/*
|
|
||||||
* You can use code similar to the following to run this program.
|
|
||||||
* Return values: >=0 - program exit status (use the <sys/wait.h>
|
|
||||||
* macros to get the exit code, it is shifted left by 8 bits),
|
|
||||||
* -1 - check errno.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
verify_password(const char *username, const char *password)
|
|
||||||
{
|
|
||||||
int pipe_fd[2];
|
|
||||||
int pid, wpid, status;
|
|
||||||
|
|
||||||
if (pipe(pipe_fd))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if ((pid = fork()) == 0) {
|
|
||||||
char *arg[3];
|
|
||||||
char *env[1];
|
|
||||||
|
|
||||||
/* child */
|
|
||||||
close(pipe_fd[1]);
|
|
||||||
if (pipe_fd[0] != 0) {
|
|
||||||
if (dup2(pipe_fd[0], 0) != 0)
|
|
||||||
_exit(127);
|
|
||||||
close(pipe_fd[0]);
|
|
||||||
}
|
|
||||||
arg[0] = "/usr/bin/pwdauth";
|
|
||||||
arg[1] = username;
|
|
||||||
arg[2] = NULL;
|
|
||||||
env[0] = NULL;
|
|
||||||
execve(arg[0], arg, env);
|
|
||||||
_exit(127);
|
|
||||||
} else if (pid == -1) {
|
|
||||||
/* error */
|
|
||||||
close(pipe_fd[0]);
|
|
||||||
close(pipe_fd[1]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* parent */
|
|
||||||
close(pipe_fd[0]);
|
|
||||||
write(pipe_fd[1], password, strlen(password));
|
|
||||||
write(pipe_fd[1], "\n", 1);
|
|
||||||
close(pipe_fd[1]);
|
|
||||||
|
|
||||||
while ((wpid = wait(&status)) != pid) {
|
|
||||||
if (wpid == -1)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
Hello Marek,
|
|
||||||
|
|
||||||
I have created a diffile against the 980403 release that adds
|
|
||||||
functionality to newusers for automatic handling of users with only
|
|
||||||
anonymous ftp login (using the guestgroup feature in ftpaccess, which
|
|
||||||
means that the users home directory looks like '/home/user/./'). It also
|
|
||||||
adds a commandline argument to specify an initial directory structure
|
|
||||||
for such users, with a tarball normally containing the bin,lib,etc
|
|
||||||
directories used in the chrooted environment.
|
|
||||||
|
|
||||||
I am using it to automatically create chunks of users with only ftp
|
|
||||||
access for a webserver.
|
|
||||||
|
|
||||||
I have tried to follow your coding standards and I believe it is bug
|
|
||||||
free but.. well, who knows. :) It's not much code however.
|
|
||||||
|
|
||||||
I hope you find it useful. Do what you like with it, feel free to ask if
|
|
||||||
anything is unclear.
|
|
||||||
|
|
||||||
Best rgds,
|
|
||||||
Calle Karlsson
|
|
||||||
ckn@kash.se
|
|
||||||
|
|
||||||
diff -uNr shadow-980403.orig/src/newusers.c shadow-980403/src/newusers.c
|
|
||||||
--- shadow-980403.orig/src/newusers.c Fri Jan 30 00:22:43 1998
|
|
||||||
+++ shadow-980403/src/newusers.c Fri Apr 17 16:55:33 1998
|
|
||||||
@@ -76,11 +76,35 @@
|
|
||||||
static void
|
|
||||||
usage(void)
|
|
||||||
{
|
|
||||||
- fprintf(stderr, "Usage: %s [ input ]\n", Prog);
|
|
||||||
+ fprintf (stderr, "Usage: %s [-p prototype tarfile] [ input ]\n", Prog);
|
|
||||||
+ fprintf (stderr, "The prototype tarfile is only used for users\n");
|
|
||||||
+ fprintf (stderr, "marked as anonymous ftp users. It must be a full pathname.\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
+ * createuserdir - create a directory and chmod it
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
+createuserdir (char * dir, int uid, int gid, int line)
|
|
||||||
+{
|
|
||||||
+ if (mkdir (dir, 0777 & ~getdef_num("UMASK", 077))) {
|
|
||||||
+ fprintf (stderr, "%s: line %d: mkdir %s failed\n",
|
|
||||||
+ Prog, line, dir);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (chown (dir, uid, gid)) {
|
|
||||||
+ fprintf (stderr, "%s: line %d: chown %s failed\n",
|
|
||||||
+ Prog, line, dir);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
* add_group - create a new group or add a user to an existing group
|
|
||||||
*/
|
|
||||||
|
|
||||||
@@ -328,6 +352,8 @@
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
char buf[BUFSIZ];
|
|
||||||
+ char anonproto[BUFSIZ];
|
|
||||||
+ int flag;
|
|
||||||
char *fields[8];
|
|
||||||
int nfields;
|
|
||||||
char *cp;
|
|
||||||
@@ -340,12 +366,23 @@
|
|
||||||
|
|
||||||
Prog = Basename(argv[0]);
|
|
||||||
|
|
||||||
- if (argc > 1 && argv[1][0] == '-')
|
|
||||||
- usage ();
|
|
||||||
+ * anonproto = '\0';
|
|
||||||
+
|
|
||||||
+ while ((flag = getopt (argc, argv, "p:h")) != EOF) {
|
|
||||||
+ switch (flag) {
|
|
||||||
+ case 'p':
|
|
||||||
+ STRFCPY(anonproto, optarg);
|
|
||||||
+ break;
|
|
||||||
+ case 'h':
|
|
||||||
+ default:
|
|
||||||
+ usage ();
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- if (argc == 2) {
|
|
||||||
- if (! freopen (argv[1], "r", stdin)) {
|
|
||||||
- snprintf(buf, sizeof buf, "%s: %s", Prog, argv[1]);
|
|
||||||
+ if (optind < argc) {
|
|
||||||
+ if (! freopen (argv[optind], "r", stdin)) {
|
|
||||||
+ snprintf(buf, sizeof buf, "%s: %s", Prog, argv[optind]);
|
|
||||||
perror (buf);
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
@@ -499,15 +536,36 @@
|
|
||||||
if (fields[6][0])
|
|
||||||
newpw.pw_shell = fields[6];
|
|
||||||
|
|
||||||
- if (newpw.pw_dir[0] && access(newpw.pw_dir, F_OK)) {
|
|
||||||
- if (mkdir (newpw.pw_dir,
|
|
||||||
- 0777 & ~getdef_num("UMASK", 077)))
|
|
||||||
- fprintf (stderr, "%s: line %d: mkdir failed\n",
|
|
||||||
- Prog, line);
|
|
||||||
- else if (chown (newpw.pw_dir,
|
|
||||||
- newpw.pw_uid, newpw.pw_gid))
|
|
||||||
- fprintf (stderr, "%s: line %d: chown failed\n",
|
|
||||||
- Prog, line);
|
|
||||||
+ if (newpw.pw_dir[0]) {
|
|
||||||
+ char * userdir = strdup (newpw.pw_dir);
|
|
||||||
+ char * anonpart;
|
|
||||||
+ int rc;
|
|
||||||
+
|
|
||||||
+ if ((anonpart = strstr (userdir, "/./"))) {
|
|
||||||
+ * anonpart = '\0';
|
|
||||||
+ anonpart += 2;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (access(userdir, F_OK))
|
|
||||||
+ rc = createuserdir (userdir, newpw.pw_uid, newpw.pw_gid, line);
|
|
||||||
+ else
|
|
||||||
+ rc = 0;
|
|
||||||
+
|
|
||||||
+ if (rc == 0 && anonpart) {
|
|
||||||
+ if (* anonproto) {
|
|
||||||
+ char cmdbuf [BUFSIZ];
|
|
||||||
+ snprintf(cmdbuf, sizeof cmdbuf,
|
|
||||||
+ "cd %s; tar xf %s",
|
|
||||||
+ userdir, anonproto);
|
|
||||||
+ system (cmdbuf);
|
|
||||||
+ }
|
|
||||||
+ if (strlen (anonpart) > 1) {
|
|
||||||
+ strcat (userdir, anonpart);
|
|
||||||
+ if (access (userdir, F_OK))
|
|
||||||
+ createuserdir (userdir, newpw.pw_uid, newpw.pw_gid, line);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ free (userdir);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Binary file not shown.
@@ -1,791 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2018-03-07.03; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2018 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 <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
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 <bug-automake@gnu.org>.
|
|
||||||
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:
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
|
||||||
# and also cooperate to make a distribution for `make dist'
|
|
||||||
|
|
||||||
EXTRA_DIST = HOWTO README.limits \
|
|
||||||
README.platforms WISHLIST console.c.spec.txt cracklib26.diff
|
|
||||||
-481
@@ -1,481 +0,0 @@
|
|||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 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@
|
|
||||||
|
|
||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
|
||||||
# and also cooperate to make a distribution for `make dist'
|
|
||||||
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 = doc
|
|
||||||
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_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@
|
|
||||||
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@
|
|
||||||
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@
|
|
||||||
ECONF_CPPFLAGS = @ECONF_CPPFLAGS@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
FGREP = @FGREP@
|
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
|
||||||
GMSGFMT = @GMSGFMT@
|
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
|
||||||
GREP = @GREP@
|
|
||||||
GROUP_NAME_MAX_LENGTH = @GROUP_NAME_MAX_LENGTH@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
INTLLIBS = @INTLLIBS@
|
|
||||||
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBACL = @LIBACL@
|
|
||||||
LIBATTR = @LIBATTR@
|
|
||||||
LIBAUDIT = @LIBAUDIT@
|
|
||||||
LIBCRACK = @LIBCRACK@
|
|
||||||
LIBCRYPT = @LIBCRYPT@
|
|
||||||
LIBECONF = @LIBECONF@
|
|
||||||
LIBICONV = @LIBICONV@
|
|
||||||
LIBINTL = @LIBINTL@
|
|
||||||
LIBMD = @LIBMD@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBPAM = @LIBPAM@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LIBSELINUX = @LIBSELINUX@
|
|
||||||
LIBSEMANAGE = @LIBSEMANAGE@
|
|
||||||
LIBSKEY = @LIBSKEY@
|
|
||||||
LIBTCB = @LIBTCB@
|
|
||||||
LIBTOOL = @LIBTOOL@
|
|
||||||
LIPO = @LIPO@
|
|
||||||
LN_S = @LN_S@
|
|
||||||
LTLIBICONV = @LTLIBICONV@
|
|
||||||
LTLIBINTL = @LTLIBINTL@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
|
||||||
MAINT = @MAINT@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
MSGFMT = @MSGFMT@
|
|
||||||
MSGFMT_015 = @MSGFMT_015@
|
|
||||||
MSGMERGE = @MSGMERGE@
|
|
||||||
NM = @NM@
|
|
||||||
NMEDIT = @NMEDIT@
|
|
||||||
OBJDUMP = @OBJDUMP@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
OTOOL = @OTOOL@
|
|
||||||
OTOOL64 = @OTOOL64@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
POSUB = @POSUB@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
USE_NLS = @USE_NLS@
|
|
||||||
VENDORDIR = @VENDORDIR@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
XGETTEXT = @XGETTEXT@
|
|
||||||
XGETTEXT_015 = @XGETTEXT_015@
|
|
||||||
XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
|
|
||||||
XMLCATALOG = @XMLCATALOG@
|
|
||||||
XML_CATALOG_FILE = @XML_CATALOG_FILE@
|
|
||||||
XSLTPROC = @XSLTPROC@
|
|
||||||
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@
|
|
||||||
capcmd = @capcmd@
|
|
||||||
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@
|
|
||||||
EXTRA_DIST = HOWTO README.limits \
|
|
||||||
README.platforms WISHLIST console.c.spec.txt cracklib26.diff
|
|
||||||
|
|
||||||
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 doc/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --foreign doc/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
|
|
||||||
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:
|
|
||||||
|
|
||||||
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-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-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
|
|
||||||
|
|
||||||
|
|
||||||
# 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:
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
|
|
||||||
ABOUT shadow-login limits:
|
|
||||||
|
|
||||||
This code is merged into shadow login program from the original LShell 2.01
|
|
||||||
written by Joel Katz. The port and some additional features have been added
|
|
||||||
by Cristian Gafton (gafton@sorosis.ro).
|
|
||||||
|
|
||||||
|
|
||||||
Changes:
|
|
||||||
- 96/04/16
|
|
||||||
- {spaces,tabs} allowed within limits string
|
|
||||||
- Warn via syslog multiple default limits
|
|
||||||
- added few paragraphs to the login man page
|
|
||||||
- 96/04/14
|
|
||||||
- code merged into lmain.c --cristiang
|
|
||||||
|
|
||||||
TODO: - support groups in the limits file
|
|
||||||
(only usernames are supported at this moment :-( )
|
|
||||||
|
|
||||||
Setting user limits for shadow login program
|
|
||||||
|
|
||||||
First, make a root-only-readable file (/etc/limits by default or LIMITS_FILE
|
|
||||||
defined config.h) that describes the resource limits you wish to impose. By
|
|
||||||
default no quotas are imposed on 'root'. In fact, there is no way to impose
|
|
||||||
limits via this procedure to root-equiv accounts (accounts with UID 0).
|
|
||||||
|
|
||||||
Each line describes a limit for a user in the form:
|
|
||||||
|
|
||||||
user LIMITS_STRING
|
|
||||||
|
|
||||||
The LIMITS_STRING is a string of a concatenated list of resource limits.
|
|
||||||
Each limit consists of a letter identifier followed by a numerical limit.
|
|
||||||
The valid identifiers are:
|
|
||||||
|
|
||||||
A: max address space (KB)
|
|
||||||
C: max core file size (KB)
|
|
||||||
D: max data size (KB)
|
|
||||||
F: maximum filesize (KB)
|
|
||||||
M: max locked-in-memory address space (KB)
|
|
||||||
N: max number of open files
|
|
||||||
R: max resident set size (KB)
|
|
||||||
S: max stack size (KB)
|
|
||||||
T: max CPU time (MIN)
|
|
||||||
U: max number of processes
|
|
||||||
L: max number of logins for this user
|
|
||||||
|
|
||||||
For example, L2D2048N5 is a valid LIMITS_STRING. For reading convenience,
|
|
||||||
the following entries are equivalent:
|
|
||||||
|
|
||||||
username L2D2048N5
|
|
||||||
username L2 D2048 N5
|
|
||||||
|
|
||||||
Be aware that after <username> the rest of the line is considered a limit
|
|
||||||
string, thus comments are not allowed. A invalid limits string will be
|
|
||||||
rejected (not considered) by the login program.
|
|
||||||
|
|
||||||
The default entry is denoted by username '*'. If you have multiple 'default'
|
|
||||||
entries in your LIMITS_FILE, then the last one will be used as the default
|
|
||||||
entry.
|
|
||||||
|
|
||||||
To completely disable limits for a user, a single dash (-) will do.
|
|
||||||
|
|
||||||
Also, please note that all limit settings are set PER LOGIN. They are
|
|
||||||
not global, nor are they permanent. Perhaps global limits will come, but
|
|
||||||
for now this will have to do ;)
|
|
||||||
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# $Id$
|
|
||||||
#
|
|
||||||
# This is the current (still incomplete) list of platforms this
|
|
||||||
# package has been verified to work on. Additions (preferably
|
|
||||||
# in the format as described below) are welcome. Thanks!
|
|
||||||
#
|
|
||||||
# V: last version reported to work
|
|
||||||
# H: host type
|
|
||||||
# L: Linux libc version
|
|
||||||
# D: Linux distribution, or other OS name and version
|
|
||||||
# C: changes (if any)
|
|
||||||
# R: reported by
|
|
||||||
|
|
||||||
V: 980529
|
|
||||||
H: sparc-unknown-linux-gnu
|
|
||||||
L: glibc-2.0.7
|
|
||||||
D: Ultrapenguin-1.0.9
|
|
||||||
C: had to explicitly disable desrpc.
|
|
||||||
R: Bjorn Christianson <bjorn@cascade.psychology.mcmaster.ca>
|
|
||||||
|
|
||||||
V: 980724
|
|
||||||
H: i486-pc-linux-gnulibc1
|
|
||||||
L: libc-5.4.33
|
|
||||||
D: Debian-1.3.1.r6
|
|
||||||
C: none (use dpkg-buildpackage)
|
|
||||||
R: Marek Michalkiewicz <marekm@linux.org.pl>
|
|
||||||
|
|
||||||
V: current
|
|
||||||
H: i686-pc-linux-gnu
|
|
||||||
L: glibc-2.0.7.19981211
|
|
||||||
D: Debian-2.1
|
|
||||||
C: none (use dpkg-buildpackage)
|
|
||||||
R: Marek Michalkiewicz <marekm@linux.org.pl>
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
$Id$
|
|
||||||
|
|
||||||
This is my wishlist for the shadow suite, in no particular order. Feel
|
|
||||||
free to do anything from this list and mail me the diffs :-).
|
|
||||||
|
|
||||||
Patches in diff -u format, against the latest version (sometimes in the
|
|
||||||
"beta" directory) are preferred and make my job easier. Please, no
|
|
||||||
MIME, base64, quoted-printable, or HTML. For very big patches, or if
|
|
||||||
your mailer can corrupt them, please use gzip and uuencode. Thanks!
|
|
||||||
|
|
||||||
New ideas to add to this list are welcome, too. --marekm
|
|
||||||
|
|
||||||
- fix all the bugs, of course
|
|
||||||
- implement "su only" accounts (no logins, only su from other account)
|
|
||||||
- rewrite getdef.c to be more general? (no hardcoded names)
|
|
||||||
- patch for rlogind/telnetd to create utmp entry and fill in ut_addr
|
|
||||||
- option to specify encrypted password in passwd (for yppasswdd, so it
|
|
||||||
doesn't need to know about shadow/non-shadow); should probably use a pipe
|
|
||||||
(less insecure than command line arguments)
|
|
||||||
- add support for changing NIS passwords
|
|
||||||
- add option to check passwords by piping them to external programs
|
|
||||||
- add functionality of the contrib/rpasswd.c wrapper to passwd
|
|
||||||
- option to generate pronounceable passwords (like on SCO), external program?
|
|
||||||
- poppassd (remote password change for eudora etc.)
|
|
||||||
- add support for passwd/shadow db files (glibc)
|
|
||||||
- vipw: check password files for errors after editing
|
|
||||||
- add "maximum time users allowed to stay logged in" limit option to logoutd
|
|
||||||
- handle quotes in /etc/environment like the shell does (but sshd doesn't...)
|
|
||||||
- better utmpx support (logoutd, ...)
|
|
||||||
- better OPIE support (report number of logins left, etc.)
|
|
||||||
- new option for /etc/suauth: don't load user's environment (force "su -")
|
|
||||||
suggested by Ulisses Alonso Camaro
|
|
||||||
- find out why recent releases won't compile on Solaris
|
|
||||||
- newusers should be able to copy /etc/skel to the new home directory
|
|
||||||
(like useradd)
|
|
||||||
- add directories where other packages can add hooks for package-specific
|
|
||||||
per-user configuration, to be executed with run-parts. Some hooks should
|
|
||||||
be executed at package install time for existing users, likewise for
|
|
||||||
package removal and possibly modification. (Debian Bug#36019)
|
|
||||||
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
$Id$
|
|
||||||
|
|
||||||
Specification for console.c source file --
|
|
||||||
|
|
||||||
input values --
|
|
||||||
tty -- character pointer to device name with leading "/dev/"
|
|
||||||
removed.
|
|
||||||
|
|
||||||
return values --
|
|
||||||
0 -- false
|
|
||||||
1 -- true
|
|
||||||
|
|
||||||
int console (char * tty)
|
|
||||||
if "CONSOLE" string value is not present in login.defs
|
|
||||||
return true
|
|
||||||
|
|
||||||
if the first character of "CONSOLE" string value is not "/"
|
|
||||||
treat the string as a ":" delimited list of device
|
|
||||||
names and search for the value of tty in that
|
|
||||||
tokenized list.
|
|
||||||
|
|
||||||
if a match is found
|
|
||||||
return true
|
|
||||||
|
|
||||||
return false
|
|
||||||
|
|
||||||
if the file named by "CONSOLE" cannot be opened
|
|
||||||
return true
|
|
||||||
|
|
||||||
scan the file looking for a match between the input line
|
|
||||||
and the value of tty
|
|
||||||
|
|
||||||
if a match is found
|
|
||||||
return true
|
|
||||||
|
|
||||||
return false
|
|
||||||
@@ -1,340 +0,0 @@
|
|||||||
diff -ur orig/cracklib26_small/cracklib/fascist.c cracklib26_small/cracklib/fascist.c
|
|
||||||
--- orig/cracklib26_small/cracklib/fascist.c Mon Dec 15 02:56:55 1997
|
|
||||||
+++ cracklib26_small/cracklib/fascist.c Sat Apr 4 22:14:45 1998
|
|
||||||
@@ -12,6 +12,7 @@
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
+#include <string.h>
|
|
||||||
|
|
||||||
#define ISSKIP(x) (isspace(x) || ispunct(x))
|
|
||||||
|
|
||||||
@@ -460,28 +461,27 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
-FascistGecos(password, uid)
|
|
||||||
+FascistGecosPw(password, pwd)
|
|
||||||
char *password;
|
|
||||||
- int uid;
|
|
||||||
+ struct passwd *pwd;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int j;
|
|
||||||
int wc;
|
|
||||||
char *ptr;
|
|
||||||
- struct passwd *pwp;
|
|
||||||
char gbuffer[STRINGSIZE];
|
|
||||||
char tbuffer[STRINGSIZE];
|
|
||||||
char *uwords[STRINGSIZE];
|
|
||||||
char longbuffer[STRINGSIZE * 2];
|
|
||||||
|
|
||||||
- if (!(pwp = getpwuid(uid)))
|
|
||||||
+ if (!pwd)
|
|
||||||
{
|
|
||||||
return ("you are not registered in the password file");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* lets get really paranoid and assume a dangerously long gecos entry */
|
|
||||||
|
|
||||||
- strncpy(tbuffer, pwp->pw_name, STRINGSIZE);
|
|
||||||
+ strncpy(tbuffer, pwd->pw_name, STRINGSIZE);
|
|
||||||
tbuffer[STRINGSIZE-1] = '\0';
|
|
||||||
if (GTry(tbuffer, password))
|
|
||||||
{
|
|
||||||
@@ -490,12 +490,13 @@
|
|
||||||
|
|
||||||
/* it never used to be that you got passwd strings > 1024 chars, but now... */
|
|
||||||
|
|
||||||
- strncpy(tbuffer, pwp->pw_gecos, STRINGSIZE);
|
|
||||||
+ strncpy(tbuffer, pwd->pw_gecos, STRINGSIZE);
|
|
||||||
tbuffer[STRINGSIZE-1] = '\0';
|
|
||||||
strcpy(gbuffer, Lowercase(tbuffer));
|
|
||||||
|
|
||||||
wc = 0;
|
|
||||||
ptr = gbuffer;
|
|
||||||
+ uwords[0] = (char *) 0;
|
|
||||||
|
|
||||||
while (*ptr)
|
|
||||||
{
|
|
||||||
@@ -530,6 +531,8 @@
|
|
||||||
*(ptr++) = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+ if (!uwords[0])
|
|
||||||
+ return ((char *) 0); /* empty gecos */
|
|
||||||
#ifdef DEBUG
|
|
||||||
for (i = 0; uwords[i]; i++)
|
|
||||||
{
|
|
||||||
@@ -586,9 +589,10 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
-FascistLook(pwp, instring)
|
|
||||||
+FascistLookPw(pwp, instring, pwd)
|
|
||||||
PWDICT *pwp;
|
|
||||||
char *instring;
|
|
||||||
+ struct passwd *pwd;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *ptr;
|
|
||||||
@@ -667,7 +671,7 @@
|
|
||||||
return ("it looks like a National Insurance number.");
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (ptr = FascistGecos(password, getuid()))
|
|
||||||
+ if (ptr = FascistGecosPw(password, pwd ? pwd : getpwuid(getuid())))
|
|
||||||
{
|
|
||||||
return (ptr);
|
|
||||||
}
|
|
||||||
@@ -715,9 +719,10 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
-FascistCheck(password, path)
|
|
||||||
+FascistCheckPw(password, path, pwd)
|
|
||||||
char *password;
|
|
||||||
char *path;
|
|
||||||
+ struct passwd *pwd;
|
|
||||||
{
|
|
||||||
static char lastpath[STRINGSIZE];
|
|
||||||
static PWDICT *pwp;
|
|
||||||
@@ -750,5 +755,29 @@
|
|
||||||
strncpy(lastpath, path, STRINGSIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
- return (FascistLook(pwp, pwtrunced));
|
|
||||||
+ return (FascistLookPw(pwp, pwtrunced, pwd));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+char *
|
|
||||||
+FascistGecos(password, uid)
|
|
||||||
+ char *password;
|
|
||||||
+ int uid;
|
|
||||||
+{
|
|
||||||
+ return (FascistGecosPw(password, getpwuid(uid)));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+char *
|
|
||||||
+FascistLook(pwp, instring)
|
|
||||||
+ PWDICT *pwp;
|
|
||||||
+ char *instring;
|
|
||||||
+{
|
|
||||||
+ return (FascistLookPw(pwp, instring, (char *) 0));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+char *
|
|
||||||
+FascistCheck(password, path)
|
|
||||||
+ char *password;
|
|
||||||
+ char *path;
|
|
||||||
+{
|
|
||||||
+ return (FascistCheckPw(password, path, (char *) 0));
|
|
||||||
}
|
|
||||||
diff -ur orig/cracklib26_small/cracklib/packer.h cracklib26_small/cracklib/packer.h
|
|
||||||
--- orig/cracklib26_small/cracklib/packer.h Mon Dec 15 00:09:30 1997
|
|
||||||
+++ cracklib26_small/cracklib/packer.h Sat Jan 10 22:13:46 1998
|
|
||||||
@@ -34,6 +34,7 @@
|
|
||||||
FILE *dfp;
|
|
||||||
FILE *wfp;
|
|
||||||
|
|
||||||
+ int canfree;
|
|
||||||
int32 flags;
|
|
||||||
#define PFOR_WRITE 0x0001
|
|
||||||
#define PFOR_FLUSH 0x0002
|
|
||||||
diff -ur orig/cracklib26_small/cracklib/packlib.c cracklib26_small/cracklib/packlib.c
|
|
||||||
--- orig/cracklib26_small/cracklib/packlib.c Fri Jul 9 22:22:58 1993
|
|
||||||
+++ cracklib26_small/cracklib/packlib.c Sat Jan 10 22:28:49 1998
|
|
||||||
@@ -16,7 +16,7 @@
|
|
||||||
char *mode;
|
|
||||||
{
|
|
||||||
int32 i;
|
|
||||||
- static PWDICT pdesc;
|
|
||||||
+ PWDICT *pdesc;
|
|
||||||
char iname[STRINGSIZE];
|
|
||||||
char dname[STRINGSIZE];
|
|
||||||
char wname[STRINGSIZE];
|
|
||||||
@@ -25,92 +25,94 @@
|
|
||||||
FILE *ifp;
|
|
||||||
FILE *wfp;
|
|
||||||
|
|
||||||
- if (pdesc.header.pih_magic == PIH_MAGIC)
|
|
||||||
- {
|
|
||||||
- fprintf(stderr, "%s: another dictionary already open\n", prefix);
|
|
||||||
+ if ((pdesc = (PWDICT *) malloc(sizeof(PWDICT))) == 0)
|
|
||||||
return ((PWDICT *) 0);
|
|
||||||
- }
|
|
||||||
|
|
||||||
- memset(&pdesc, '\0', sizeof(pdesc));
|
|
||||||
+ memset(pdesc, '\0', sizeof(*pdesc));
|
|
||||||
|
|
||||||
sprintf(iname, "%s.pwi", prefix);
|
|
||||||
sprintf(dname, "%s.pwd", prefix);
|
|
||||||
sprintf(wname, "%s.hwm", prefix);
|
|
||||||
|
|
||||||
- if (!(pdesc.dfp = fopen(dname, mode)))
|
|
||||||
+ if (!(pdesc->dfp = fopen(dname, mode)))
|
|
||||||
{
|
|
||||||
perror(dname);
|
|
||||||
+ free(pdesc);
|
|
||||||
return ((PWDICT *) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!(pdesc.ifp = fopen(iname, mode)))
|
|
||||||
+ if (!(pdesc->ifp = fopen(iname, mode)))
|
|
||||||
{
|
|
||||||
- fclose(pdesc.dfp);
|
|
||||||
+ fclose(pdesc->dfp);
|
|
||||||
perror(iname);
|
|
||||||
+ free(pdesc);
|
|
||||||
return ((PWDICT *) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (pdesc.wfp = fopen(wname, mode))
|
|
||||||
+ if (pdesc->wfp = fopen(wname, mode))
|
|
||||||
{
|
|
||||||
- pdesc.flags |= PFOR_USEHWMS;
|
|
||||||
+ pdesc->flags |= PFOR_USEHWMS;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ifp = pdesc.ifp;
|
|
||||||
- dfp = pdesc.dfp;
|
|
||||||
- wfp = pdesc.wfp;
|
|
||||||
+ ifp = pdesc->ifp;
|
|
||||||
+ dfp = pdesc->dfp;
|
|
||||||
+ wfp = pdesc->wfp;
|
|
||||||
|
|
||||||
if (mode[0] == 'w')
|
|
||||||
{
|
|
||||||
- pdesc.flags |= PFOR_WRITE;
|
|
||||||
- pdesc.header.pih_magic = PIH_MAGIC;
|
|
||||||
- pdesc.header.pih_blocklen = NUMWORDS;
|
|
||||||
- pdesc.header.pih_numwords = 0;
|
|
||||||
+ pdesc->flags |= PFOR_WRITE;
|
|
||||||
+ pdesc->header.pih_magic = PIH_MAGIC;
|
|
||||||
+ pdesc->header.pih_blocklen = NUMWORDS;
|
|
||||||
+ pdesc->header.pih_numwords = 0;
|
|
||||||
|
|
||||||
- fwrite((char *) &pdesc.header, sizeof(pdesc.header), 1, ifp);
|
|
||||||
+ fwrite((char *) &pdesc->header, sizeof(pdesc->header), 1, ifp);
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
- pdesc.flags &= ~PFOR_WRITE;
|
|
||||||
+ pdesc->flags &= ~PFOR_WRITE;
|
|
||||||
|
|
||||||
- if (!fread((char *) &pdesc.header, sizeof(pdesc.header), 1, ifp))
|
|
||||||
+ if (!fread((char *) &pdesc->header, sizeof(pdesc->header), 1, ifp))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s: error reading header\n", prefix);
|
|
||||||
|
|
||||||
- pdesc.header.pih_magic = 0;
|
|
||||||
+ pdesc->header.pih_magic = 0;
|
|
||||||
fclose(ifp);
|
|
||||||
fclose(dfp);
|
|
||||||
+ free(pdesc);
|
|
||||||
return ((PWDICT *) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (pdesc.header.pih_magic != PIH_MAGIC)
|
|
||||||
+ if (pdesc->header.pih_magic != PIH_MAGIC)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s: magic mismatch\n", prefix);
|
|
||||||
|
|
||||||
- pdesc.header.pih_magic = 0;
|
|
||||||
+ pdesc->header.pih_magic = 0;
|
|
||||||
fclose(ifp);
|
|
||||||
fclose(dfp);
|
|
||||||
+ free(pdesc);
|
|
||||||
return ((PWDICT *) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (pdesc.header.pih_blocklen != NUMWORDS)
|
|
||||||
+ if (pdesc->header.pih_blocklen != NUMWORDS)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s: size mismatch\n", prefix);
|
|
||||||
|
|
||||||
- pdesc.header.pih_magic = 0;
|
|
||||||
+ pdesc->header.pih_magic = 0;
|
|
||||||
fclose(ifp);
|
|
||||||
fclose(dfp);
|
|
||||||
+ free(pdesc);
|
|
||||||
return ((PWDICT *) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (pdesc.flags & PFOR_USEHWMS)
|
|
||||||
+ if (pdesc->flags & PFOR_USEHWMS)
|
|
||||||
{
|
|
||||||
- if (fread(pdesc.hwms, 1, sizeof(pdesc.hwms), wfp) != sizeof(pdesc.hwms))
|
|
||||||
+ if (fread(pdesc->hwms, 1, sizeof(pdesc->hwms), wfp) != sizeof(pdesc->hwms))
|
|
||||||
{
|
|
||||||
- pdesc.flags &= ~PFOR_USEHWMS;
|
|
||||||
+ pdesc->flags &= ~PFOR_USEHWMS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- return (&pdesc);
|
|
||||||
+ pdesc->canfree = 1;
|
|
||||||
+ return (pdesc);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
@@ -159,8 +161,13 @@
|
|
||||||
|
|
||||||
fclose(pwp->ifp);
|
|
||||||
fclose(pwp->dfp);
|
|
||||||
+ if (pwp->wfp)
|
|
||||||
+ fclose(pwp->wfp);
|
|
||||||
|
|
||||||
- pwp->header.pih_magic = 0;
|
|
||||||
+ if (pwp->canfree)
|
|
||||||
+ free(pwp);
|
|
||||||
+ else
|
|
||||||
+ pwp->header.pih_magic = 0;
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
@@ -307,6 +314,11 @@
|
|
||||||
register char *this;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
+/*
|
|
||||||
+ * comment in npasswd-2.0beta4 says this:
|
|
||||||
+ * This does not work under all circumstances, so don't bother
|
|
||||||
+ */
|
|
||||||
+#if 0
|
|
||||||
if (pwp->flags & PFOR_USEHWMS)
|
|
||||||
{
|
|
||||||
idx = string[0] & 0xff;
|
|
||||||
@@ -317,6 +329,10 @@
|
|
||||||
lwm = 0;
|
|
||||||
hwm = PW_WORDS(pwp) - 1;
|
|
||||||
}
|
|
||||||
+#else
|
|
||||||
+ lwm = 0;
|
|
||||||
+ hwm = PW_WORDS(pwp);
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("---- %lu, %lu ----\n", lwm, hwm);
|
|
||||||
diff -ur orig/cracklib26_small/util/mkdict cracklib26_small/util/mkdict
|
|
||||||
--- orig/cracklib26_small/util/mkdict Fri Jul 9 22:23:03 1993
|
|
||||||
+++ cracklib26_small/util/mkdict Sat Apr 4 22:31:45 1998
|
|
||||||
@@ -14,9 +14,16 @@
|
|
||||||
SORT="sort"
|
|
||||||
###SORT="sort -T /tmp"
|
|
||||||
|
|
||||||
-cat $* |
|
|
||||||
+### Use zcat to read compressed (as well as uncompressed) dictionaries.
|
|
||||||
+### Compressed dictionaries can save quite a lot of disk space.
|
|
||||||
+
|
|
||||||
+CAT="gzip -cdf"
|
|
||||||
+###CAT="zcat"
|
|
||||||
+###CAT="cat"
|
|
||||||
+
|
|
||||||
+$CAT $* |
|
|
||||||
tr '[A-Z]' '[a-z]' |
|
|
||||||
- tr -cd '[\012a-z0-9]' |
|
|
||||||
+ tr -cd '\012[a-z][0-9]' |
|
|
||||||
$SORT |
|
|
||||||
uniq |
|
|
||||||
grep -v '^#' |
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
|
||||||
# and also cooperate to make a distribution for `make dist'
|
|
||||||
|
|
||||||
sysconf_DATA = login.defs
|
|
||||||
|
|
||||||
defaultdir = $(sysconfdir)/default
|
|
||||||
default_DATA = \
|
|
||||||
useradd
|
|
||||||
|
|
||||||
nonpam_files = \
|
|
||||||
limits \
|
|
||||||
login.access
|
|
||||||
|
|
||||||
if !USE_PAM
|
|
||||||
nonpamdir = $(sysconfdir)
|
|
||||||
nonpam_DATA = $(nonpam_files)
|
|
||||||
endif
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
$(nonpam_files) \
|
|
||||||
$(sysconf_DATA) \
|
|
||||||
$(default_DATA)
|
|
||||||
|
|
||||||
SUBDIRS = pam.d
|
|
||||||
-776
@@ -1,776 +0,0 @@
|
|||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 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@
|
|
||||||
|
|
||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
|
||||||
# and also cooperate to make a distribution for `make dist'
|
|
||||||
|
|
||||||
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 = etc
|
|
||||||
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_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
|
|
||||||
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)$(defaultdir)" "$(DESTDIR)$(nonpamdir)" \
|
|
||||||
"$(DESTDIR)$(sysconfdir)"
|
|
||||||
DATA = $(default_DATA) $(nonpam_DATA) $(sysconf_DATA)
|
|
||||||
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)`
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
am__relativize = \
|
|
||||||
dir0=`pwd`; \
|
|
||||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
|
||||||
sed_rest='s,^[^/]*/*,,'; \
|
|
||||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
|
||||||
sed_butlast='s,/*[^/]*$$,,'; \
|
|
||||||
while test -n "$$dir1"; do \
|
|
||||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first" != "."; then \
|
|
||||||
if test "$$first" = ".."; then \
|
|
||||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
|
||||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
|
||||||
else \
|
|
||||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first2" = "$$first"; then \
|
|
||||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
|
||||||
else \
|
|
||||||
dir2="../$$dir2"; \
|
|
||||||
fi; \
|
|
||||||
dir0="$$dir0"/"$$first"; \
|
|
||||||
fi; \
|
|
||||||
fi; \
|
|
||||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
|
||||||
done; \
|
|
||||||
reldir="$$dir2"
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
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@
|
|
||||||
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@
|
|
||||||
ECONF_CPPFLAGS = @ECONF_CPPFLAGS@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
FGREP = @FGREP@
|
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
|
||||||
GMSGFMT = @GMSGFMT@
|
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
|
||||||
GREP = @GREP@
|
|
||||||
GROUP_NAME_MAX_LENGTH = @GROUP_NAME_MAX_LENGTH@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
INTLLIBS = @INTLLIBS@
|
|
||||||
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBACL = @LIBACL@
|
|
||||||
LIBATTR = @LIBATTR@
|
|
||||||
LIBAUDIT = @LIBAUDIT@
|
|
||||||
LIBCRACK = @LIBCRACK@
|
|
||||||
LIBCRYPT = @LIBCRYPT@
|
|
||||||
LIBECONF = @LIBECONF@
|
|
||||||
LIBICONV = @LIBICONV@
|
|
||||||
LIBINTL = @LIBINTL@
|
|
||||||
LIBMD = @LIBMD@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBPAM = @LIBPAM@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LIBSELINUX = @LIBSELINUX@
|
|
||||||
LIBSEMANAGE = @LIBSEMANAGE@
|
|
||||||
LIBSKEY = @LIBSKEY@
|
|
||||||
LIBTCB = @LIBTCB@
|
|
||||||
LIBTOOL = @LIBTOOL@
|
|
||||||
LIPO = @LIPO@
|
|
||||||
LN_S = @LN_S@
|
|
||||||
LTLIBICONV = @LTLIBICONV@
|
|
||||||
LTLIBINTL = @LTLIBINTL@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
|
||||||
MAINT = @MAINT@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
MSGFMT = @MSGFMT@
|
|
||||||
MSGFMT_015 = @MSGFMT_015@
|
|
||||||
MSGMERGE = @MSGMERGE@
|
|
||||||
NM = @NM@
|
|
||||||
NMEDIT = @NMEDIT@
|
|
||||||
OBJDUMP = @OBJDUMP@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
OTOOL = @OTOOL@
|
|
||||||
OTOOL64 = @OTOOL64@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
POSUB = @POSUB@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
USE_NLS = @USE_NLS@
|
|
||||||
VENDORDIR = @VENDORDIR@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
XGETTEXT = @XGETTEXT@
|
|
||||||
XGETTEXT_015 = @XGETTEXT_015@
|
|
||||||
XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
|
|
||||||
XMLCATALOG = @XMLCATALOG@
|
|
||||||
XML_CATALOG_FILE = @XML_CATALOG_FILE@
|
|
||||||
XSLTPROC = @XSLTPROC@
|
|
||||||
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@
|
|
||||||
capcmd = @capcmd@
|
|
||||||
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@
|
|
||||||
sysconf_DATA = login.defs
|
|
||||||
defaultdir = $(sysconfdir)/default
|
|
||||||
default_DATA = \
|
|
||||||
useradd
|
|
||||||
|
|
||||||
nonpam_files = \
|
|
||||||
limits \
|
|
||||||
login.access
|
|
||||||
|
|
||||||
@USE_PAM_FALSE@nonpamdir = $(sysconfdir)
|
|
||||||
@USE_PAM_FALSE@nonpam_DATA = $(nonpam_files)
|
|
||||||
EXTRA_DIST = \
|
|
||||||
$(nonpam_files) \
|
|
||||||
$(sysconf_DATA) \
|
|
||||||
$(default_DATA)
|
|
||||||
|
|
||||||
SUBDIRS = pam.d
|
|
||||||
all: all-recursive
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign etc/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --foreign etc/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
|
|
||||||
install-defaultDATA: $(default_DATA)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
@list='$(default_DATA)'; test -n "$(defaultdir)" || list=; \
|
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(defaultdir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(defaultdir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(defaultdir)'"; \
|
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(defaultdir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-defaultDATA:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(default_DATA)'; test -n "$(defaultdir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
dir='$(DESTDIR)$(defaultdir)'; $(am__uninstall_files_from_dir)
|
|
||||||
install-nonpamDATA: $(nonpam_DATA)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
@list='$(nonpam_DATA)'; test -n "$(nonpamdir)" || list=; \
|
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(nonpamdir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(nonpamdir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(nonpamdir)'"; \
|
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(nonpamdir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-nonpamDATA:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(nonpam_DATA)'; test -n "$(nonpamdir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
dir='$(DESTDIR)$(nonpamdir)'; $(am__uninstall_files_from_dir)
|
|
||||||
install-sysconfDATA: $(sysconf_DATA)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
@list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \
|
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(sysconfdir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(sysconfdir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \
|
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-sysconfDATA:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
dir='$(DESTDIR)$(sysconfdir)'; $(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.
|
|
||||||
$(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
|
|
||||||
check-am: all-am
|
|
||||||
check: check-recursive
|
|
||||||
all-am: Makefile $(DATA)
|
|
||||||
installdirs: installdirs-recursive
|
|
||||||
installdirs-am:
|
|
||||||
for dir in "$(DESTDIR)$(defaultdir)" "$(DESTDIR)$(nonpamdir)" "$(DESTDIR)$(sysconfdir)"; do \
|
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
|
||||||
done
|
|
||||||
install: install-recursive
|
|
||||||
install-exec: install-exec-recursive
|
|
||||||
install-data: install-data-recursive
|
|
||||||
uninstall: uninstall-recursive
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-recursive
|
|
||||||
install-strip:
|
|
||||||
if test -z '$(STRIP)'; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
install; \
|
|
||||||
else \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
|
||||||
fi
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-recursive
|
|
||||||
|
|
||||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-recursive
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-generic distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-recursive
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-recursive
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-recursive
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am: install-defaultDATA install-nonpamDATA
|
|
||||||
|
|
||||||
install-dvi: install-dvi-recursive
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am: install-sysconfDATA
|
|
||||||
|
|
||||||
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: uninstall-defaultDATA uninstall-nonpamDATA \
|
|
||||||
uninstall-sysconfDATA
|
|
||||||
|
|
||||||
.MAKE: $(am__recursive_targets) install-am install-strip
|
|
||||||
|
|
||||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
|
|
||||||
check-am clean clean-generic clean-libtool cscopelist-am ctags \
|
|
||||||
ctags-am 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-defaultDATA install-dvi install-dvi-am install-exec \
|
|
||||||
install-exec-am install-html install-html-am install-info \
|
|
||||||
install-info-am install-man install-nonpamDATA install-pdf \
|
|
||||||
install-pdf-am install-ps install-ps-am install-strip \
|
|
||||||
install-sysconfDATA 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-defaultDATA uninstall-nonpamDATA \
|
|
||||||
uninstall-sysconfDATA
|
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
|
||||||
# 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:
|
|
||||||
-30
@@ -1,30 +0,0 @@
|
|||||||
# /etc/limits contains user resource limits.
|
|
||||||
# See limits(5).
|
|
||||||
#
|
|
||||||
# Format:
|
|
||||||
# <username> <limits-string>
|
|
||||||
#
|
|
||||||
# default entry is '*' for username
|
|
||||||
#
|
|
||||||
# Valid flags are:
|
|
||||||
# A: max address space (KB)
|
|
||||||
# C: max core file size (KB)
|
|
||||||
# D: max data size (KB)
|
|
||||||
# F: maximum filesize (KB)
|
|
||||||
# M: max locked-in-memory address space (KB) [only for root on Linux 2.0.x]
|
|
||||||
# N: max number of open files
|
|
||||||
# R: max resident set size (KB) [no effect on Linux 2.0.x]
|
|
||||||
# S: max stack size (KB)
|
|
||||||
# T: max CPU time (MIN)
|
|
||||||
# U: max number of processes
|
|
||||||
# L: max number of logins for this user
|
|
||||||
# I: max nice value (0..39 translates to 20..-19)
|
|
||||||
# O: max real time priority (0..MAX_RT_PRIO)
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
# the default entry
|
|
||||||
#* L2 D6144 R2048 S2048 U32 N32 F16384 T5 C0 I20 O0
|
|
||||||
# another way of suspending a user login
|
|
||||||
#guest L0
|
|
||||||
# this account has no limits
|
|
||||||
#sysadm -
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# $Id$
|
|
||||||
#
|
|
||||||
# Login access control table.
|
|
||||||
#
|
|
||||||
# When someone logs in, the table is scanned for the first entry that
|
|
||||||
# matches the (user, host) combination, or, in case of non-networked
|
|
||||||
# logins, the first entry that matches the (user, tty) combination. The
|
|
||||||
# permissions field of that table entry determines whether the login will
|
|
||||||
# be accepted or refused.
|
|
||||||
#
|
|
||||||
# Format of the login access control table is three fields separated by a
|
|
||||||
# ":" character:
|
|
||||||
#
|
|
||||||
# permission : users : origins
|
|
||||||
#
|
|
||||||
# The first field should be a "+" (access granted) or "-" (access denied)
|
|
||||||
# character.
|
|
||||||
#
|
|
||||||
# The second field should be a list of one or more login names, group
|
|
||||||
# names, or ALL (always matches). A pattern of the form user@host is
|
|
||||||
# matched when the login name matches the "user" part, and when the
|
|
||||||
# "host" part matches the local machine name.
|
|
||||||
#
|
|
||||||
# The third field should be a list of one or more tty names (for
|
|
||||||
# non-networked logins), host names, domain names (begin with "."), host
|
|
||||||
# addresses, internet network numbers (end with "."), ALL (always
|
|
||||||
# matches) or LOCAL (matches any string that does not contain a "."
|
|
||||||
# character).
|
|
||||||
#
|
|
||||||
# If you run NIS you can use @netgroupname in host or user patterns; this
|
|
||||||
# even works for @usergroup@@hostgroup patterns. Weird.
|
|
||||||
#
|
|
||||||
# The EXCEPT operator makes it possible to write very compact rules.
|
|
||||||
#
|
|
||||||
# The group file is searched only when a name does not match that of the
|
|
||||||
# logged-in user. Only groups are matched in which users are explicitly
|
|
||||||
# listed: the program does not look at a user's primary group id value.
|
|
||||||
#
|
|
||||||
##############################################################################
|
|
||||||
#
|
|
||||||
# Disallow console logins to all but a few accounts.
|
|
||||||
#
|
|
||||||
#-:ALL EXCEPT wheel shutdown sync:console
|
|
||||||
#
|
|
||||||
# Disallow non-local logins to privileged accounts (group wheel).
|
|
||||||
#
|
|
||||||
#-:wheel:ALL EXCEPT LOCAL .win.tue.nl
|
|
||||||
#
|
|
||||||
# Some accounts are not allowed to login from anywhere:
|
|
||||||
#
|
|
||||||
#-:wsbscaro wsbsecr wsbspac wsbsym wscosor wstaiwde:ALL
|
|
||||||
#
|
|
||||||
# All other accounts are allowed to login from anywhere.
|
|
||||||
#
|
|
||||||
-425
@@ -1,425 +0,0 @@
|
|||||||
#
|
|
||||||
# /etc/login.defs - Configuration control definitions for the shadow package.
|
|
||||||
#
|
|
||||||
# $Id$
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Delay in seconds before being allowed another attempt after a login failure
|
|
||||||
# Note: When PAM is used, some modules may enforce a minimum delay (e.g.
|
|
||||||
# pam_unix(8) enforces a 2s delay)
|
|
||||||
#
|
|
||||||
FAIL_DELAY 3
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable logging and display of /var/log/faillog login(1) failure info.
|
|
||||||
#
|
|
||||||
FAILLOG_ENAB yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable display of unknown usernames when login(1) failures are recorded.
|
|
||||||
#
|
|
||||||
LOG_UNKFAIL_ENAB no
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable logging of successful logins
|
|
||||||
#
|
|
||||||
LOG_OK_LOGINS no
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable logging and display of /var/log/lastlog login(1) time info.
|
|
||||||
#
|
|
||||||
LASTLOG_ENAB yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Limit the highest user ID number for which the lastlog entries should
|
|
||||||
# be updated.
|
|
||||||
#
|
|
||||||
# No LASTLOG_UID_MAX means that there is no user ID limit for writing
|
|
||||||
# lastlog entries.
|
|
||||||
#
|
|
||||||
#LASTLOG_UID_MAX
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable checking and display of mailbox status upon login.
|
|
||||||
#
|
|
||||||
# Disable if the shell startup files already check for mail
|
|
||||||
# ("mailx -e" or equivalent).
|
|
||||||
#
|
|
||||||
MAIL_CHECK_ENAB yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable additional checks upon password changes.
|
|
||||||
#
|
|
||||||
OBSCURE_CHECKS_ENAB yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable checking of time restrictions specified in /etc/porttime.
|
|
||||||
#
|
|
||||||
PORTTIME_CHECKS_ENAB yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable setting of ulimit, umask, and niceness from passwd(5) gecos field.
|
|
||||||
#
|
|
||||||
QUOTAS_ENAB yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable "syslog" logging of su(1) activity - in addition to sulog file logging.
|
|
||||||
# SYSLOG_SG_ENAB does the same for newgrp(1) and sg(1).
|
|
||||||
#
|
|
||||||
SYSLOG_SU_ENAB yes
|
|
||||||
SYSLOG_SG_ENAB yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, either full pathname of a file containing device names or
|
|
||||||
# a ":" delimited list of device names. Root logins will be allowed only
|
|
||||||
# from these devices.
|
|
||||||
#
|
|
||||||
CONSOLE /etc/securetty
|
|
||||||
#CONSOLE console:tty01:tty02:tty03:tty04
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, all su(1) activity is logged to this file.
|
|
||||||
#
|
|
||||||
#SULOG_FILE /var/log/sulog
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, ":" delimited list of "message of the day" files to
|
|
||||||
# be displayed upon login.
|
|
||||||
#
|
|
||||||
MOTD_FILE /etc/motd
|
|
||||||
#MOTD_FILE /etc/motd:/usr/lib/news/news-motd
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, this file will be output before each login(1) prompt.
|
|
||||||
#
|
|
||||||
#ISSUE_FILE /etc/issue
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, file which maps tty line to TERM environment parameter.
|
|
||||||
# Each line of the file is in a format similar to "vt100 tty01".
|
|
||||||
#
|
|
||||||
#TTYTYPE_FILE /etc/ttytype
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, login(1) failures will be logged here in a utmp format.
|
|
||||||
# last(1), when invoked as lastb(1), will read /var/log/btmp, so...
|
|
||||||
#
|
|
||||||
FTMP_FILE /var/log/btmp
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, name of file whose presence will inhibit non-root
|
|
||||||
# logins. The content of this file should be a message indicating
|
|
||||||
# why logins are inhibited.
|
|
||||||
#
|
|
||||||
NOLOGINS_FILE /etc/nologin
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, the command name to display when running "su -". For
|
|
||||||
# example, if this is defined as "su" then ps(1) will display the
|
|
||||||
# command as "-su". If not defined, then ps(1) will display the
|
|
||||||
# name of the shell actually being run, e.g. something like "-sh".
|
|
||||||
#
|
|
||||||
SU_NAME su
|
|
||||||
|
|
||||||
#
|
|
||||||
# *REQUIRED*
|
|
||||||
# Directory where mailboxes reside, _or_ name of file, relative to the
|
|
||||||
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
|
|
||||||
#
|
|
||||||
MAIL_DIR /var/spool/mail
|
|
||||||
#MAIL_FILE .mail
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, file which inhibits all the usual chatter during the login
|
|
||||||
# sequence. If a full pathname, then hushed mode will be enabled if the
|
|
||||||
# user's name or shell are found in the file. If not a full pathname, then
|
|
||||||
# hushed mode will be enabled if the file exists in the user's home directory.
|
|
||||||
#
|
|
||||||
HUSHLOGIN_FILE .hushlogin
|
|
||||||
#HUSHLOGIN_FILE /etc/hushlogins
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, either a TZ environment parameter spec or the
|
|
||||||
# fully-rooted pathname of a file containing such a spec.
|
|
||||||
#
|
|
||||||
#ENV_TZ TZ=CST6CDT
|
|
||||||
#ENV_TZ /etc/tzname
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, an HZ environment parameter spec.
|
|
||||||
#
|
|
||||||
# for Linux/x86
|
|
||||||
ENV_HZ HZ=100
|
|
||||||
# For Linux/Alpha...
|
|
||||||
#ENV_HZ HZ=1024
|
|
||||||
|
|
||||||
#
|
|
||||||
# *REQUIRED* The default PATH settings, for superuser and normal users.
|
|
||||||
#
|
|
||||||
# (they are minimal, add the rest in the shell startup files)
|
|
||||||
ENV_SUPATH PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
|
||||||
ENV_PATH PATH=/bin:/usr/bin
|
|
||||||
|
|
||||||
#
|
|
||||||
# Terminal permissions
|
|
||||||
#
|
|
||||||
# TTYGROUP Login tty will be assigned this group ownership.
|
|
||||||
# TTYPERM Login tty will be set to this permission.
|
|
||||||
#
|
|
||||||
# If you have a write(1) program which is "setgid" to a special group
|
|
||||||
# which owns the terminals, define TTYGROUP as the number of such group
|
|
||||||
# and TTYPERM as 0620. Otherwise leave TTYGROUP commented out and
|
|
||||||
# set TTYPERM to either 622 or 600.
|
|
||||||
#
|
|
||||||
TTYGROUP tty
|
|
||||||
TTYPERM 0600
|
|
||||||
|
|
||||||
#
|
|
||||||
# Login configuration initializations:
|
|
||||||
#
|
|
||||||
# ERASECHAR Terminal ERASE character ('\010' = backspace).
|
|
||||||
# KILLCHAR Terminal KILL character ('\025' = CTRL/U).
|
|
||||||
# ULIMIT Default "ulimit" value.
|
|
||||||
#
|
|
||||||
# The ERASECHAR and KILLCHAR are used only on System V machines.
|
|
||||||
# The ULIMIT is used only if the system supports it.
|
|
||||||
# (now it works with setrlimit too; ulimit is in 512-byte units)
|
|
||||||
#
|
|
||||||
# Prefix these values with "0" to get octal, "0x" to get hexadecimal.
|
|
||||||
#
|
|
||||||
ERASECHAR 0177
|
|
||||||
KILLCHAR 025
|
|
||||||
#ULIMIT 2097152
|
|
||||||
|
|
||||||
# Default initial "umask" value used by login(1) on non-PAM enabled systems.
|
|
||||||
# Default "umask" value for pam_umask(8) on PAM enabled systems.
|
|
||||||
# UMASK is also used by useradd(8) and newusers(8) to set the mode for new
|
|
||||||
# home directories.
|
|
||||||
# 022 is the default value, but 027, or even 077, could be considered
|
|
||||||
# for increased privacy. There is no One True Answer here: each sysadmin
|
|
||||||
# must make up their mind.
|
|
||||||
UMASK 022
|
|
||||||
|
|
||||||
#
|
|
||||||
# Password aging controls:
|
|
||||||
#
|
|
||||||
# PASS_MAX_DAYS Maximum number of days a password may be used.
|
|
||||||
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
|
|
||||||
# PASS_MIN_LEN Minimum acceptable password length.
|
|
||||||
# PASS_WARN_AGE Number of days warning given before a password expires.
|
|
||||||
#
|
|
||||||
PASS_MAX_DAYS 99999
|
|
||||||
PASS_MIN_DAYS 0
|
|
||||||
PASS_MIN_LEN 5
|
|
||||||
PASS_WARN_AGE 7
|
|
||||||
|
|
||||||
#
|
|
||||||
# If "yes", the user must be listed as a member of the first gid 0 group
|
|
||||||
# in /etc/group (called "root" on most Linux systems) to be able to "su"
|
|
||||||
# to uid 0 accounts. If the group doesn't exist or is empty, no one
|
|
||||||
# will be able to "su" to uid 0.
|
|
||||||
#
|
|
||||||
SU_WHEEL_ONLY no
|
|
||||||
|
|
||||||
#
|
|
||||||
# If compiled with cracklib support, sets the path to the dictionaries
|
|
||||||
#
|
|
||||||
CRACKLIB_DICTPATH /var/cache/cracklib/cracklib_dict
|
|
||||||
|
|
||||||
#
|
|
||||||
# Min/max values for automatic uid selection in useradd(8)
|
|
||||||
#
|
|
||||||
UID_MIN 1000
|
|
||||||
UID_MAX 60000
|
|
||||||
# System accounts
|
|
||||||
SYS_UID_MIN 101
|
|
||||||
SYS_UID_MAX 999
|
|
||||||
# Extra per user uids
|
|
||||||
SUB_UID_MIN 100000
|
|
||||||
SUB_UID_MAX 600100000
|
|
||||||
SUB_UID_COUNT 65536
|
|
||||||
|
|
||||||
#
|
|
||||||
# Min/max values for automatic gid selection in groupadd(8)
|
|
||||||
#
|
|
||||||
GID_MIN 1000
|
|
||||||
GID_MAX 60000
|
|
||||||
# System accounts
|
|
||||||
SYS_GID_MIN 101
|
|
||||||
SYS_GID_MAX 999
|
|
||||||
# Extra per user group ids
|
|
||||||
SUB_GID_MIN 100000
|
|
||||||
SUB_GID_MAX 600100000
|
|
||||||
SUB_GID_COUNT 65536
|
|
||||||
|
|
||||||
#
|
|
||||||
# Max number of login(1) retries if password is bad
|
|
||||||
#
|
|
||||||
LOGIN_RETRIES 5
|
|
||||||
|
|
||||||
#
|
|
||||||
# Max time in seconds for login(1)
|
|
||||||
#
|
|
||||||
LOGIN_TIMEOUT 60
|
|
||||||
|
|
||||||
#
|
|
||||||
# Maximum number of attempts to change password if rejected (too easy)
|
|
||||||
#
|
|
||||||
PASS_CHANGE_TRIES 5
|
|
||||||
|
|
||||||
#
|
|
||||||
# Warn about weak passwords (but still allow them) if you are root.
|
|
||||||
#
|
|
||||||
PASS_ALWAYS_WARN yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Number of significant characters in the password for crypt().
|
|
||||||
# Default is 8, don't change unless your crypt() is better.
|
|
||||||
# Ignored if MD5_CRYPT_ENAB set to "yes".
|
|
||||||
#
|
|
||||||
#PASS_MAX_LEN 8
|
|
||||||
|
|
||||||
#
|
|
||||||
# Require password before chfn(1)/chsh(1) can make any changes.
|
|
||||||
#
|
|
||||||
CHFN_AUTH yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Which fields may be changed by regular users using chfn(1) - use
|
|
||||||
# any combination of letters "frwh" (full name, room number, work
|
|
||||||
# phone, home phone). If not defined, no changes are allowed.
|
|
||||||
# For backward compatibility, "yes" = "rwh" and "no" = "frwh".
|
|
||||||
#
|
|
||||||
CHFN_RESTRICT rwh
|
|
||||||
|
|
||||||
#
|
|
||||||
# Password prompt (%s will be replaced by user name).
|
|
||||||
#
|
|
||||||
# XXX - it doesn't work correctly yet, for now leave it commented out
|
|
||||||
# to use the default which is just "Password: ".
|
|
||||||
#LOGIN_STRING "%s's Password: "
|
|
||||||
|
|
||||||
#
|
|
||||||
# Only works if compiled with MD5_CRYPT defined:
|
|
||||||
# If set to "yes", new passwords will be encrypted using the MD5-based
|
|
||||||
# algorithm compatible with the one used by recent releases of FreeBSD.
|
|
||||||
# It supports passwords of unlimited length and longer salt strings.
|
|
||||||
# Set to "no" if you need to copy encrypted passwords to other systems
|
|
||||||
# which don't understand the new algorithm. Default is "no".
|
|
||||||
#
|
|
||||||
# Note: If you use PAM, it is recommended to use a value consistent with
|
|
||||||
# the PAM modules configuration.
|
|
||||||
#
|
|
||||||
# This variable is deprecated. You should use ENCRYPT_METHOD instead.
|
|
||||||
#
|
|
||||||
#MD5_CRYPT_ENAB no
|
|
||||||
|
|
||||||
#
|
|
||||||
# Only works if compiled with ENCRYPTMETHOD_SELECT defined:
|
|
||||||
# If set to MD5, MD5-based algorithm will be used for encrypting password
|
|
||||||
# If set to SHA256, SHA256-based algorithm will be used for encrypting password
|
|
||||||
# If set to SHA512, SHA512-based algorithm will be used for encrypting password
|
|
||||||
# If set to BCRYPT, BCRYPT-based algorithm will be used for encrypting password
|
|
||||||
# If set to DES, DES-based algorithm will be used for encrypting password (default)
|
|
||||||
# Overrides the MD5_CRYPT_ENAB option
|
|
||||||
#
|
|
||||||
# Note: If you use PAM, it is recommended to use a value consistent with
|
|
||||||
# the PAM modules configuration.
|
|
||||||
#
|
|
||||||
#ENCRYPT_METHOD DES
|
|
||||||
|
|
||||||
#
|
|
||||||
# Only works if ENCRYPT_METHOD is set to SHA256 or SHA512.
|
|
||||||
#
|
|
||||||
# Define the number of SHA rounds.
|
|
||||||
# With a lot of rounds, it is more difficult to brute-force the password.
|
|
||||||
# However, more CPU resources will be needed to authenticate users if
|
|
||||||
# this value is increased.
|
|
||||||
#
|
|
||||||
# If not specified, the libc will choose the default number of rounds (5000).
|
|
||||||
# The values must be within the 1000-999999999 range.
|
|
||||||
# If only one of the MIN or MAX values is set, then this value will be used.
|
|
||||||
# If MIN > MAX, the highest value will be used.
|
|
||||||
#
|
|
||||||
#SHA_CRYPT_MIN_ROUNDS 5000
|
|
||||||
#SHA_CRYPT_MAX_ROUNDS 5000
|
|
||||||
|
|
||||||
#
|
|
||||||
# Only works if ENCRYPT_METHOD is set to BCRYPT.
|
|
||||||
#
|
|
||||||
# Define the number of BCRYPT rounds.
|
|
||||||
# With a lot of rounds, it is more difficult to brute-force the password.
|
|
||||||
# However, more CPU resources will be needed to authenticate users if
|
|
||||||
# this value is increased.
|
|
||||||
#
|
|
||||||
# If not specified, 13 rounds will be attempted.
|
|
||||||
# If only one of the MIN or MAX values is set, then this value will be used.
|
|
||||||
# If MIN > MAX, the highest value will be used.
|
|
||||||
#
|
|
||||||
#BCRYPT_MIN_ROUNDS 13
|
|
||||||
#BCRYPT_MAX_ROUNDS 13
|
|
||||||
|
|
||||||
#
|
|
||||||
# List of groups to add to the user's supplementary group set
|
|
||||||
# when logging in from the console (as determined by the CONSOLE
|
|
||||||
# setting). Default is none.
|
|
||||||
#
|
|
||||||
# Use with caution - it is possible for users to gain permanent
|
|
||||||
# access to these groups, even when not logged in from the console.
|
|
||||||
# How to do it is left as an exercise for the reader...
|
|
||||||
#
|
|
||||||
#CONSOLE_GROUPS floppy:audio:cdrom
|
|
||||||
|
|
||||||
#
|
|
||||||
# Should login be allowed if we can't cd to the home directory?
|
|
||||||
# Default is no.
|
|
||||||
#
|
|
||||||
DEFAULT_HOME yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# If this file exists and is readable, login environment will be
|
|
||||||
# read from it. Every line should be in the form name=value.
|
|
||||||
#
|
|
||||||
ENVIRON_FILE /etc/environment
|
|
||||||
|
|
||||||
#
|
|
||||||
# If defined, this command is run when removing a user.
|
|
||||||
# It should remove any at/cron/print jobs etc. owned by
|
|
||||||
# the user to be removed (passed as the first argument).
|
|
||||||
#
|
|
||||||
#USERDEL_CMD /usr/sbin/userdel_local
|
|
||||||
|
|
||||||
#
|
|
||||||
# Enable setting of the umask group bits to be the same as owner bits
|
|
||||||
# (examples: 022 -> 002, 077 -> 007) for non-root users, if the uid is
|
|
||||||
# the same as gid, and username is the same as the primary group name.
|
|
||||||
#
|
|
||||||
# This also enables userdel(8) to remove user groups if no members exist.
|
|
||||||
#
|
|
||||||
USERGROUPS_ENAB yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# If set to a non-zero number, the shadow utilities will make sure that
|
|
||||||
# groups never have more than this number of users on one line.
|
|
||||||
# This permits to support split groups (groups split into multiple lines,
|
|
||||||
# with the same group ID, to avoid limitation of the line length in the
|
|
||||||
# group file).
|
|
||||||
#
|
|
||||||
# 0 is the default value and disables this feature.
|
|
||||||
#
|
|
||||||
#MAX_MEMBERS_PER_GROUP 0
|
|
||||||
|
|
||||||
#
|
|
||||||
# If useradd(8) should create home directories for users by default (non
|
|
||||||
# system users only).
|
|
||||||
# This option is overridden with the -M or -m flags on the useradd(8)
|
|
||||||
# command-line.
|
|
||||||
#
|
|
||||||
#CREATE_HOME yes
|
|
||||||
|
|
||||||
#
|
|
||||||
# Force use shadow, even if shadow passwd & shadow group files are
|
|
||||||
# missing.
|
|
||||||
#
|
|
||||||
#FORCE_SHADOW yes
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
|
||||||
# and also cooperate to make a distribution for `make dist'
|
|
||||||
|
|
||||||
pamd_files = \
|
|
||||||
chfn \
|
|
||||||
chsh \
|
|
||||||
groupmems \
|
|
||||||
login \
|
|
||||||
passwd
|
|
||||||
|
|
||||||
pamd_acct_tools_files = \
|
|
||||||
chage \
|
|
||||||
chgpasswd \
|
|
||||||
chpasswd \
|
|
||||||
groupadd \
|
|
||||||
groupdel \
|
|
||||||
groupmod \
|
|
||||||
newusers \
|
|
||||||
useradd \
|
|
||||||
userdel \
|
|
||||||
usermod
|
|
||||||
|
|
||||||
if USE_PAM
|
|
||||||
pamddir = $(sysconfdir)/pam.d
|
|
||||||
pamd_DATA = $(pamd_files)
|
|
||||||
if ACCT_TOOLS_SETUID
|
|
||||||
pamd_DATA += $(pamd_acct_tools_files)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if WITH_SU
|
|
||||||
pamd_files += su
|
|
||||||
endif
|
|
||||||
|
|
||||||
EXTRA_DIST = $(pamd_files) $(pamd_acct_tools_files)
|
|
||||||
@@ -1,550 +0,0 @@
|
|||||||
# Makefile.in generated by automake 1.16.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994-2018 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@
|
|
||||||
|
|
||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
|
||||||
# and also cooperate to make a distribution for `make dist'
|
|
||||||
|
|
||||||
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@
|
|
||||||
@ACCT_TOOLS_SETUID_TRUE@@USE_PAM_TRUE@am__append_1 = $(pamd_acct_tools_files)
|
|
||||||
@WITH_SU_TRUE@am__append_2 = su
|
|
||||||
subdir = etc/pam.d
|
|
||||||
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_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__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)$(pamddir)"
|
|
||||||
DATA = $(pamd_DATA)
|
|
||||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in
|
|
||||||
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@
|
|
||||||
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@
|
|
||||||
ECONF_CPPFLAGS = @ECONF_CPPFLAGS@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
FGREP = @FGREP@
|
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
|
||||||
GMSGFMT = @GMSGFMT@
|
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
|
||||||
GREP = @GREP@
|
|
||||||
GROUP_NAME_MAX_LENGTH = @GROUP_NAME_MAX_LENGTH@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
INTLLIBS = @INTLLIBS@
|
|
||||||
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBACL = @LIBACL@
|
|
||||||
LIBATTR = @LIBATTR@
|
|
||||||
LIBAUDIT = @LIBAUDIT@
|
|
||||||
LIBCRACK = @LIBCRACK@
|
|
||||||
LIBCRYPT = @LIBCRYPT@
|
|
||||||
LIBECONF = @LIBECONF@
|
|
||||||
LIBICONV = @LIBICONV@
|
|
||||||
LIBINTL = @LIBINTL@
|
|
||||||
LIBMD = @LIBMD@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBPAM = @LIBPAM@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LIBSELINUX = @LIBSELINUX@
|
|
||||||
LIBSEMANAGE = @LIBSEMANAGE@
|
|
||||||
LIBSKEY = @LIBSKEY@
|
|
||||||
LIBTCB = @LIBTCB@
|
|
||||||
LIBTOOL = @LIBTOOL@
|
|
||||||
LIPO = @LIPO@
|
|
||||||
LN_S = @LN_S@
|
|
||||||
LTLIBICONV = @LTLIBICONV@
|
|
||||||
LTLIBINTL = @LTLIBINTL@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
|
||||||
MAINT = @MAINT@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
MSGFMT = @MSGFMT@
|
|
||||||
MSGFMT_015 = @MSGFMT_015@
|
|
||||||
MSGMERGE = @MSGMERGE@
|
|
||||||
NM = @NM@
|
|
||||||
NMEDIT = @NMEDIT@
|
|
||||||
OBJDUMP = @OBJDUMP@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
OTOOL = @OTOOL@
|
|
||||||
OTOOL64 = @OTOOL64@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
POSUB = @POSUB@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
USE_NLS = @USE_NLS@
|
|
||||||
VENDORDIR = @VENDORDIR@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
XGETTEXT = @XGETTEXT@
|
|
||||||
XGETTEXT_015 = @XGETTEXT_015@
|
|
||||||
XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
|
|
||||||
XMLCATALOG = @XMLCATALOG@
|
|
||||||
XML_CATALOG_FILE = @XML_CATALOG_FILE@
|
|
||||||
XSLTPROC = @XSLTPROC@
|
|
||||||
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@
|
|
||||||
capcmd = @capcmd@
|
|
||||||
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@
|
|
||||||
pamd_files = chfn chsh groupmems login passwd $(am__append_2)
|
|
||||||
pamd_acct_tools_files = \
|
|
||||||
chage \
|
|
||||||
chgpasswd \
|
|
||||||
chpasswd \
|
|
||||||
groupadd \
|
|
||||||
groupdel \
|
|
||||||
groupmod \
|
|
||||||
newusers \
|
|
||||||
useradd \
|
|
||||||
userdel \
|
|
||||||
usermod
|
|
||||||
|
|
||||||
@USE_PAM_TRUE@pamddir = $(sysconfdir)/pam.d
|
|
||||||
@USE_PAM_TRUE@pamd_DATA = $(pamd_files) $(am__append_1)
|
|
||||||
EXTRA_DIST = $(pamd_files) $(pamd_acct_tools_files)
|
|
||||||
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 etc/pam.d/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --foreign etc/pam.d/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
|
|
||||||
install-pamdDATA: $(pamd_DATA)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
@list='$(pamd_DATA)'; test -n "$(pamddir)" || list=; \
|
|
||||||
if test -n "$$list"; then \
|
|
||||||
echo " $(MKDIR_P) '$(DESTDIR)$(pamddir)'"; \
|
|
||||||
$(MKDIR_P) "$(DESTDIR)$(pamddir)" || exit 1; \
|
|
||||||
fi; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pamddir)'"; \
|
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(pamddir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-pamdDATA:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(pamd_DATA)'; test -n "$(pamddir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
dir='$(DESTDIR)$(pamddir)'; $(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)'; \
|
|
||||||
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 $(DATA)
|
|
||||||
installdirs:
|
|
||||||
for dir in "$(DESTDIR)$(pamddir)"; 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-libtool mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-generic
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-am
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am: install-pamdDATA
|
|
||||||
|
|
||||||
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: uninstall-pamdDATA
|
|
||||||
|
|
||||||
.MAKE: install-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-dvi \
|
|
||||||
install-dvi-am install-exec install-exec-am install-html \
|
|
||||||
install-html-am install-info install-info-am install-man \
|
|
||||||
install-pamdDATA 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-pamdDATA
|
|
||||||
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
|
|
||||||
|
|
||||||
# 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:
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth required pam_securetty.so
|
|
||||||
auth include system-auth
|
|
||||||
account required pam_nologin.so
|
|
||||||
account include system-auth
|
|
||||||
password include system-auth
|
|
||||||
session required pam_selinux.so close
|
|
||||||
session include system-auth
|
|
||||||
session required pam_loginuid.so
|
|
||||||
session optional pam_console.so
|
|
||||||
session required pam_selinux.so open
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth include system-auth
|
|
||||||
account include system-auth
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
# Uncomment the following line to implicitly trust users in the "wheel" group.
|
|
||||||
#auth sufficient pam_wheel.so trust use_uid
|
|
||||||
# Uncomment the following line to require a user to be in the "wheel" group.
|
|
||||||
auth required pam_wheel.so use_uid
|
|
||||||
auth include system-auth
|
|
||||||
account include system-auth
|
|
||||||
password include system-auth
|
|
||||||
session required pam_selinux.so close
|
|
||||||
session include system-auth
|
|
||||||
session required pam_selinux.so open multiple
|
|
||||||
session optional pam_xauth.so
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#%PAM-1.0
|
|
||||||
auth sufficient pam_rootok.so
|
|
||||||
account required pam_permit.so
|
|
||||||
password include system-auth
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# useradd defaults file
|
|
||||||
GROUP=1000
|
|
||||||
HOME=/home
|
|
||||||
INACTIVE=-1
|
|
||||||
EXPIRE=
|
|
||||||
SHELL=/bin/bash
|
|
||||||
SKEL=/etc/skel
|
|
||||||
CREATE_MAIL_SPOOL=yes
|
|
||||||
-518
@@ -1,518 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2018-03-11.20; # 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
|
|
||||||
|
|
||||||
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 the last data modification time)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
|
||||||
RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case $1 in
|
|
||||||
-c) ;;
|
|
||||||
|
|
||||||
-C) copy_on_change=true;;
|
|
||||||
|
|
||||||
-d) dir_arg=true;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) mode=$2
|
|
||||||
case $mode in
|
|
||||||
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
|
||||||
exit 1;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
|
||||||
|
|
||||||
-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=$?
|
|
||||||
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
|
|
||||||
'')
|
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
|
||||||
# Otherwise, rely on $mkdir_umask.
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
mkdir_mode=-m$mode
|
|
||||||
else
|
|
||||||
mkdir_mode=
|
|
||||||
fi
|
|
||||||
|
|
||||||
posix_mkdir=false
|
|
||||||
case $umask in
|
|
||||||
*[123567][0-7][0-7])
|
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# Note that $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' feature.
|
|
||||||
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;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if
|
|
||||||
$posix_mkdir && (
|
|
||||||
umask $mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
|
||||||
)
|
|
||||||
then :
|
|
||||||
else
|
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
|
||||||
# or it failed possibly due to a race condition. Create the
|
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
/*) prefix='/';;
|
|
||||||
[-=\(\)!]*) prefix='./';;
|
|
||||||
*) prefix='';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
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 && $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
|
|
||||||
# Rename the file to the real destination.
|
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
|
||||||
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
{
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
test ! -f "$dst" ||
|
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
|
||||||
} ||
|
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dst"
|
|
||||||
}
|
|
||||||
fi || exit 1
|
|
||||||
|
|
||||||
trap '' 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook '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:
|
|
||||||
Vendored
-5
@@ -1,5 +0,0 @@
|
|||||||
-kr
|
|
||||||
-i8
|
|
||||||
-bad
|
|
||||||
-pcs
|
|
||||||
-l80
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
|
|
||||||
AUTOMAKE_OPTIONS = 1.0 foreign
|
|
||||||
|
|
||||||
DEFS =
|
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libshadow.la
|
|
||||||
|
|
||||||
libshadow_la_LDFLAGS = -version-info 0:0:0
|
|
||||||
libshadow_la_CPPFLAGS = $(ECONF_CPPFLAGS)
|
|
||||||
if HAVE_VENDORDIR
|
|
||||||
libshadow_la_CPPFLAGS += -DVENDORDIR=\"$(VENDORDIR)\"
|
|
||||||
endif
|
|
||||||
|
|
||||||
libshadow_la_SOURCES = \
|
|
||||||
commonio.c \
|
|
||||||
commonio.h \
|
|
||||||
defines.h \
|
|
||||||
encrypt.c \
|
|
||||||
exitcodes.h \
|
|
||||||
faillog.h \
|
|
||||||
fields.c \
|
|
||||||
fputsx.c \
|
|
||||||
getdef.c \
|
|
||||||
getdef.h \
|
|
||||||
get_gid.c \
|
|
||||||
getlong.c \
|
|
||||||
get_pid.c \
|
|
||||||
get_uid.c \
|
|
||||||
getulong.c \
|
|
||||||
groupio.c \
|
|
||||||
groupmem.c \
|
|
||||||
groupio.h \
|
|
||||||
gshadow.c \
|
|
||||||
lockpw.c \
|
|
||||||
nscd.c \
|
|
||||||
nscd.h \
|
|
||||||
sssd.c \
|
|
||||||
sssd.h \
|
|
||||||
pam_defs.h \
|
|
||||||
port.c \
|
|
||||||
port.h \
|
|
||||||
prototypes.h \
|
|
||||||
pwauth.c \
|
|
||||||
pwauth.h \
|
|
||||||
pwio.c \
|
|
||||||
pwio.h \
|
|
||||||
pwmem.c \
|
|
||||||
subordinateio.h \
|
|
||||||
subordinateio.c \
|
|
||||||
selinux.c \
|
|
||||||
semanage.c \
|
|
||||||
sgetgrent.c \
|
|
||||||
sgetpwent.c \
|
|
||||||
sgetspent.c \
|
|
||||||
sgroupio.c \
|
|
||||||
sgroupio.h\
|
|
||||||
shadow.c \
|
|
||||||
shadowio.c \
|
|
||||||
shadowio.h \
|
|
||||||
shadowmem.c \
|
|
||||||
spawn.c \
|
|
||||||
utent.c
|
|
||||||
|
|
||||||
if WITH_TCB
|
|
||||||
libshadow_la_SOURCES += tcbfuncs.c tcbfuncs.h
|
|
||||||
endif
|
|
||||||
|
|
||||||
# These files are unneeded for some reason, listed in
|
|
||||||
# order of appearance:
|
|
||||||
#
|
|
||||||
# sources for dbm support (not yet used)
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
.indent.pro \
|
|
||||||
gshadow_.h
|
|
||||||
-1040
File diff suppressed because it is too large
Load Diff
-1294
File diff suppressed because it is too large
Load Diff
-171
@@ -1,171 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2001 - 2005, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 - 2010, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 COMMONIO_H
|
|
||||||
#define COMMONIO_H
|
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
|
||||||
#include <selinux/selinux.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "defines.h" /* bool */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Linked list entry.
|
|
||||||
*/
|
|
||||||
struct commonio_entry {
|
|
||||||
/*@null@*/char *line;
|
|
||||||
/*@null@*/void *eptr; /* struct passwd, struct spwd, ... */
|
|
||||||
/*@dependent@*/ /*@null@*/struct commonio_entry *prev;
|
|
||||||
/*@owned@*/ /*@null@*/struct commonio_entry *next;
|
|
||||||
bool changed:1;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Operations depending on database type: passwd, group, shadow etc.
|
|
||||||
*/
|
|
||||||
struct commonio_ops {
|
|
||||||
/*
|
|
||||||
* Make a copy of the object (for example, struct passwd)
|
|
||||||
* and all strings pointed by it, in malloced memory.
|
|
||||||
*/
|
|
||||||
/*@null@*/ /*@only@*/void *(*dup) (const void *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* free() the object including any strings pointed by it.
|
|
||||||
*/
|
|
||||||
void (*free) (/*@out@*/ /*@only@*/void *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the name of the object (for example, pw_name
|
|
||||||
* for struct passwd).
|
|
||||||
*/
|
|
||||||
const char *(*getname) (const void *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parse a string, return object (in static area -
|
|
||||||
* should be copied using the dup operation above).
|
|
||||||
*/
|
|
||||||
void *(*parse) (const char *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write the object to the file (this calls putpwent()
|
|
||||||
* for struct passwd, for example).
|
|
||||||
*/
|
|
||||||
int (*put) (const void *, FILE *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fgets and fputs (can be replaced by versions that
|
|
||||||
* understand line continuation conventions).
|
|
||||||
*/
|
|
||||||
/*@null@*/char *(*fgets) (/*@returned@*/ /*@out@*/char *s, int n, FILE *stream);
|
|
||||||
int (*fputs) (const char *, FILE *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* open_hook and close_hook.
|
|
||||||
* If non NULL, these functions will be called after the database
|
|
||||||
* is open or before it is closed.
|
|
||||||
* They return 0 on failure and 1 on success.
|
|
||||||
*/
|
|
||||||
/*@null@*/int (*open_hook) (void);
|
|
||||||
/*@null@*/int (*close_hook) (void);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Database structure.
|
|
||||||
*/
|
|
||||||
struct commonio_db {
|
|
||||||
/*
|
|
||||||
* Name of the data file.
|
|
||||||
*/
|
|
||||||
char filename[1024];
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Operations from above.
|
|
||||||
*/
|
|
||||||
/*@observer@*/const struct commonio_ops *ops;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Currently open file stream.
|
|
||||||
*/
|
|
||||||
/*@dependent@*/ /*@null@*/FILE *fp;
|
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
|
||||||
/*@null@*/security_context_t scontext;
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Default permissions and owner for newly created data file.
|
|
||||||
*/
|
|
||||||
mode_t st_mode;
|
|
||||||
uid_t st_uid;
|
|
||||||
gid_t st_gid;
|
|
||||||
/*
|
|
||||||
* Head, tail, current position in linked list.
|
|
||||||
*/
|
|
||||||
/*@owned@*/ /*@null@*/struct commonio_entry *head;
|
|
||||||
/*@dependent@*/ /*@null@*/struct commonio_entry *tail;
|
|
||||||
/*@dependent@*/ /*@null@*/struct commonio_entry *cursor;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Various flags.
|
|
||||||
*/
|
|
||||||
bool changed:1;
|
|
||||||
bool isopen:1;
|
|
||||||
bool locked:1;
|
|
||||||
bool readonly:1;
|
|
||||||
bool setname:1;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int commonio_setname (struct commonio_db *, const char *);
|
|
||||||
extern bool commonio_present (const struct commonio_db *db);
|
|
||||||
extern int commonio_lock (struct commonio_db *);
|
|
||||||
extern int commonio_lock_nowait (struct commonio_db *, bool log);
|
|
||||||
extern int commonio_open (struct commonio_db *, int);
|
|
||||||
extern /*@observer@*/ /*@null@*/const void *commonio_locate (struct commonio_db *, const char *);
|
|
||||||
extern int commonio_update (struct commonio_db *, const void *);
|
|
||||||
#ifdef ENABLE_SUBIDS
|
|
||||||
extern int commonio_append (struct commonio_db *, const void *);
|
|
||||||
#endif /* ENABLE_SUBIDS */
|
|
||||||
extern int commonio_remove (struct commonio_db *, const char *);
|
|
||||||
extern int commonio_rewind (struct commonio_db *);
|
|
||||||
extern /*@observer@*/ /*@null@*/const void *commonio_next (struct commonio_db *);
|
|
||||||
extern int commonio_close (struct commonio_db *);
|
|
||||||
extern int commonio_unlock (struct commonio_db *);
|
|
||||||
extern void commonio_del_entry (struct commonio_db *,
|
|
||||||
const struct commonio_entry *);
|
|
||||||
extern int commonio_sort_wrt (struct commonio_db *shadow,
|
|
||||||
const struct commonio_db *passwd);
|
|
||||||
extern int commonio_sort (struct commonio_db *db,
|
|
||||||
int (*cmp) (const void *, const void *));
|
|
||||||
|
|
||||||
#endif
|
|
||||||
-391
@@ -1,391 +0,0 @@
|
|||||||
/* $Id$ */
|
|
||||||
/* some useful defines */
|
|
||||||
|
|
||||||
#ifndef _DEFINES_H_
|
|
||||||
#define _DEFINES_H_
|
|
||||||
|
|
||||||
#if HAVE_STDBOOL_H
|
|
||||||
# include <stdbool.h>
|
|
||||||
#else
|
|
||||||
# if ! HAVE__BOOL
|
|
||||||
# ifdef __cplusplus
|
|
||||||
typedef bool _Bool;
|
|
||||||
# else
|
|
||||||
typedef unsigned char _Bool;
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# define bool _Bool
|
|
||||||
# define false (0)
|
|
||||||
# define true (1)
|
|
||||||
# define __bool_true_false_are_defined 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
|
|
||||||
|
|
||||||
/* Take care of NLS matters. */
|
|
||||||
#ifdef S_SPLINT_S
|
|
||||||
extern char *setlocale(int categories, const char *locale);
|
|
||||||
# define LC_ALL (6)
|
|
||||||
extern char * bindtextdomain (const char * domainname, const char * dirname);
|
|
||||||
extern char * textdomain (const char * domainname);
|
|
||||||
# define _(Text) Text
|
|
||||||
# define ngettext(Msgid1, Msgid2, N) \
|
|
||||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
|
||||||
#else
|
|
||||||
#ifdef HAVE_LOCALE_H
|
|
||||||
# include <locale.h>
|
|
||||||
#else
|
|
||||||
# undef setlocale
|
|
||||||
# define setlocale(category, locale) (NULL)
|
|
||||||
# ifndef LC_ALL
|
|
||||||
# define LC_ALL 6
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define gettext_noop(String) (String)
|
|
||||||
/* #define gettext_def(String) "#define String" */
|
|
||||||
|
|
||||||
#ifdef ENABLE_NLS
|
|
||||||
# include <libintl.h>
|
|
||||||
# define _(Text) gettext (Text)
|
|
||||||
#else
|
|
||||||
# undef bindtextdomain
|
|
||||||
# define bindtextdomain(Domain, Directory) (NULL)
|
|
||||||
# undef textdomain
|
|
||||||
# define textdomain(Domain) (NULL)
|
|
||||||
# define _(Text) Text
|
|
||||||
# define ngettext(Msgid1, Msgid2, N) \
|
|
||||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if STDC_HEADERS
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <string.h>
|
|
||||||
#else /* not STDC_HEADERS */
|
|
||||||
# ifndef HAVE_STRCHR
|
|
||||||
# define strchr index
|
|
||||||
# define strrchr rindex
|
|
||||||
# endif
|
|
||||||
char *strchr (), *strrchr (), *strtok ();
|
|
||||||
|
|
||||||
# ifndef HAVE_MEMCPY
|
|
||||||
# define memcpy(d, s, n) bcopy((s), (d), (n))
|
|
||||||
# endif
|
|
||||||
#endif /* not STDC_HEADERS */
|
|
||||||
|
|
||||||
#if HAVE_ERRNO_H
|
|
||||||
# include <errno.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#if HAVE_SYS_WAIT_H
|
|
||||||
# include <sys/wait.h>
|
|
||||||
#endif
|
|
||||||
#ifndef WEXITSTATUS
|
|
||||||
# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
|
|
||||||
#endif
|
|
||||||
#ifndef WIFEXITED
|
|
||||||
# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if TIME_WITH_SYS_TIME
|
|
||||||
# include <sys/time.h>
|
|
||||||
# include <time.h>
|
|
||||||
#else /* not TIME_WITH_SYS_TIME */
|
|
||||||
# if HAVE_SYS_TIME_H
|
|
||||||
# include <sys/time.h>
|
|
||||||
# else
|
|
||||||
# include <time.h>
|
|
||||||
# endif
|
|
||||||
#endif /* not TIME_WITH_SYS_TIME */
|
|
||||||
|
|
||||||
#ifdef HAVE_MEMSET
|
|
||||||
# define memzero(ptr, size) memset((void *)(ptr), 0, (size))
|
|
||||||
#else
|
|
||||||
# define memzero(ptr, size) bzero((char *)(ptr), (size))
|
|
||||||
#endif
|
|
||||||
#define strzero(s) memzero(s, strlen(s)) /* warning: evaluates twice */
|
|
||||||
|
|
||||||
#ifdef HAVE_DIRENT_H /* DIR_SYSV */
|
|
||||||
# include <dirent.h>
|
|
||||||
# define DIRECT dirent
|
|
||||||
#else
|
|
||||||
# ifdef HAVE_SYS_NDIR_H /* DIR_XENIX */
|
|
||||||
# include <sys/ndir.h>
|
|
||||||
# endif
|
|
||||||
# ifdef HAVE_SYS_DIR_H /* DIR_??? */
|
|
||||||
# include <sys/dir.h>
|
|
||||||
# endif
|
|
||||||
# ifdef HAVE_NDIR_H /* DIR_BSD */
|
|
||||||
# include <ndir.h>
|
|
||||||
# endif
|
|
||||||
# define DIRECT direct
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Possible cases:
|
|
||||||
* - /usr/include/shadow.h exists and includes the shadow group stuff.
|
|
||||||
* - /usr/include/shadow.h exists, but we use our own gshadow.h.
|
|
||||||
*/
|
|
||||||
#include <shadow.h>
|
|
||||||
#if defined(SHADOWGRP) && !defined(GSHADOW)
|
|
||||||
#include "gshadow_.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#ifndef NGROUPS_MAX
|
|
||||||
#ifdef NGROUPS
|
|
||||||
#define NGROUPS_MAX NGROUPS
|
|
||||||
#else
|
|
||||||
#define NGROUPS_MAX 64
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
#include <syslog.h>
|
|
||||||
|
|
||||||
#ifndef LOG_WARN
|
|
||||||
#define LOG_WARN LOG_WARNING
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* LOG_NOWAIT is deprecated */
|
|
||||||
#ifndef LOG_NOWAIT
|
|
||||||
#define LOG_NOWAIT 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* LOG_AUTH is deprecated, use LOG_AUTHPRIV instead */
|
|
||||||
#ifndef LOG_AUTHPRIV
|
|
||||||
#define LOG_AUTHPRIV LOG_AUTH
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* cleaner than lots of #ifdefs everywhere - use this as follows:
|
|
||||||
SYSLOG((LOG_CRIT, "user %s cracked root", user)); */
|
|
||||||
#ifdef ENABLE_NLS
|
|
||||||
/* Temporarily set LC_TIME to "C" to avoid strange dates in syslog.
|
|
||||||
This is a workaround for a more general syslog(d) design problem -
|
|
||||||
syslogd should log the current system time for each event, and not
|
|
||||||
trust the formatted time received from the unix domain (or worse,
|
|
||||||
UDP) socket. -MM */
|
|
||||||
/* Avoid translated PAM error messages: Set LC_ALL to "C".
|
|
||||||
* --Nekral */
|
|
||||||
#define SYSLOG(x) \
|
|
||||||
do { \
|
|
||||||
char *old_locale = setlocale (LC_ALL, NULL); \
|
|
||||||
char *saved_locale = NULL; \
|
|
||||||
if (NULL != old_locale) { \
|
|
||||||
saved_locale = strdup (old_locale); \
|
|
||||||
} \
|
|
||||||
if (NULL != saved_locale) { \
|
|
||||||
(void) setlocale (LC_ALL, "C"); \
|
|
||||||
} \
|
|
||||||
syslog x ; \
|
|
||||||
if (NULL != saved_locale) { \
|
|
||||||
(void) setlocale (LC_ALL, saved_locale); \
|
|
||||||
free (saved_locale); \
|
|
||||||
} \
|
|
||||||
} while (false)
|
|
||||||
#else /* !ENABLE_NLS */
|
|
||||||
#define SYSLOG(x) syslog x
|
|
||||||
#endif /* !ENABLE_NLS */
|
|
||||||
|
|
||||||
#else /* !USE_SYSLOG */
|
|
||||||
|
|
||||||
#define SYSLOG(x) /* empty */
|
|
||||||
#define openlog(a,b,c) /* empty */
|
|
||||||
#define closelog() /* empty */
|
|
||||||
|
|
||||||
#endif /* !USE_SYSLOG */
|
|
||||||
|
|
||||||
/* The default syslog settings can now be changed here,
|
|
||||||
in just one place. */
|
|
||||||
|
|
||||||
#ifndef SYSLOG_OPTIONS
|
|
||||||
/* #define SYSLOG_OPTIONS (LOG_PID | LOG_CONS | LOG_NOWAIT) */
|
|
||||||
#define SYSLOG_OPTIONS (LOG_PID)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SYSLOG_FACILITY
|
|
||||||
#define SYSLOG_FACILITY LOG_AUTHPRIV
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define OPENLOG(progname) openlog(progname, SYSLOG_OPTIONS, SYSLOG_FACILITY)
|
|
||||||
|
|
||||||
#ifndef F_OK
|
|
||||||
# define F_OK 0
|
|
||||||
# define X_OK 1
|
|
||||||
# define W_OK 2
|
|
||||||
# define R_OK 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SEEK_SET
|
|
||||||
# define SEEK_SET 0
|
|
||||||
# define SEEK_CUR 1
|
|
||||||
# define SEEK_END 2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef STAT_MACROS_BROKEN
|
|
||||||
# define S_ISDIR(x) ((x) & S_IFMT) == S_IFDIR)
|
|
||||||
# define S_ISREG(x) ((x) & S_IFMT) == S_IFREG)
|
|
||||||
# ifdef S_IFLNK
|
|
||||||
# define S_ISLNK(x) ((x) & S_IFMT) == S_IFLNK)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef S_ISLNK
|
|
||||||
#define S_ISLNK(x) (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_LCHOWN
|
|
||||||
#define LCHOWN lchown
|
|
||||||
#else
|
|
||||||
#define LCHOWN chown
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_LSTAT
|
|
||||||
#define LSTAT lstat
|
|
||||||
#else
|
|
||||||
#define LSTAT stat
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_TERMIOS_H
|
|
||||||
# include <termios.h>
|
|
||||||
# define STTY(fd, termio) tcsetattr(fd, TCSANOW, termio)
|
|
||||||
# define GTTY(fd, termio) tcgetattr(fd, termio)
|
|
||||||
# define TERMIO struct termios
|
|
||||||
# define USE_TERMIOS
|
|
||||||
#else /* assumed HAVE_TERMIO_H */
|
|
||||||
# include <sys/ioctl.h>
|
|
||||||
# include <termio.h>
|
|
||||||
# define STTY(fd, termio) ioctl(fd, TCSETA, termio)
|
|
||||||
# define GTTY(fd, termio) ioctl(fd, TCGETA, termio)
|
|
||||||
# define TEMRIO struct termio
|
|
||||||
# define USE_TERMIO
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Password aging constants
|
|
||||||
*
|
|
||||||
* DAY - seconds / day
|
|
||||||
* WEEK - seconds / week
|
|
||||||
* SCALE - seconds / aging unit
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Solaris defines this in shadow.h */
|
|
||||||
#ifndef DAY
|
|
||||||
#define DAY (24L*3600L)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define WEEK (7*DAY)
|
|
||||||
|
|
||||||
#ifdef ITI_AGING
|
|
||||||
#define SCALE 1
|
|
||||||
#else
|
|
||||||
#define SCALE DAY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Copy string pointed by B to array A with size checking. It was originally
|
|
||||||
in lmain.c but is _very_ useful elsewhere. Some setuid root programs with
|
|
||||||
very sloppy coding used to assume that BUFSIZ will always be enough... */
|
|
||||||
|
|
||||||
/* danger - side effects */
|
|
||||||
#define STRFCPY(A,B) \
|
|
||||||
(strncpy((A), (B), sizeof(A) - 1), (A)[sizeof(A) - 1] = '\0')
|
|
||||||
|
|
||||||
#ifndef PASSWD_FILE
|
|
||||||
#define PASSWD_FILE "/etc/passwd"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef GROUP_FILE
|
|
||||||
#define GROUP_FILE "/etc/group"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SHADOW_FILE
|
|
||||||
#define SHADOW_FILE "/etc/shadow"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SHADOWGRP
|
|
||||||
#ifndef SGROUP_FILE
|
|
||||||
#define SGROUP_FILE "/etc/gshadow"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL ((void *) 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef sun /* hacks for compiling on SunOS */
|
|
||||||
# ifndef SOLARIS
|
|
||||||
extern int fputs ();
|
|
||||||
extern char *strdup ();
|
|
||||||
extern char *strerror ();
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* string to use for the pw_passwd field in /etc/passwd when using
|
|
||||||
* shadow passwords - most systems use "x" but there are a few
|
|
||||||
* exceptions, so it can be changed here if necessary. --marekm
|
|
||||||
*/
|
|
||||||
#ifndef SHADOW_PASSWD_STRING
|
|
||||||
#define SHADOW_PASSWD_STRING "x"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SHADOW_SP_FLAG_UNSET ((unsigned long int)-1)
|
|
||||||
|
|
||||||
#ifdef WITH_AUDIT
|
|
||||||
#ifdef __u8 /* in case we use pam < 0.80 */
|
|
||||||
#undef __u8
|
|
||||||
#endif
|
|
||||||
#ifdef __u32
|
|
||||||
#undef __u32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <libaudit.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* To be used for verified unused parameters */
|
|
||||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
|
||||||
# define unused __attribute__((unused))
|
|
||||||
#else
|
|
||||||
# define unused
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ! Arguments evaluated twice ! */
|
|
||||||
#ifndef MIN
|
|
||||||
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
|
|
||||||
#endif
|
|
||||||
#ifndef MAX
|
|
||||||
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Maximum length of usernames */
|
|
||||||
#ifdef HAVE_UTMPX_H
|
|
||||||
# include <utmpx.h>
|
|
||||||
# define USER_NAME_MAX_LENGTH (sizeof (((struct utmpx *)NULL)->ut_user))
|
|
||||||
#else
|
|
||||||
# include <utmp.h>
|
|
||||||
# ifdef HAVE_STRUCT_UTMP_UT_USER
|
|
||||||
# define USER_NAME_MAX_LENGTH (sizeof (((struct utmp *)NULL)->ut_user))
|
|
||||||
# else
|
|
||||||
# ifdef HAVE_STRUCT_UTMP_UT_NAME
|
|
||||||
# define USER_NAME_MAX_LENGTH (sizeof (((struct utmp *)NULL)->ut_name))
|
|
||||||
# else
|
|
||||||
# define USER_NAME_MAX_LENGTH 32
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_SECURE_GETENV
|
|
||||||
# define shadow_getenv(name) secure_getenv(name)
|
|
||||||
# else
|
|
||||||
# define shadow_getenv(name) getenv(name)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _DEFINES_H_ */
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1993, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 - 2010, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
|
|
||||||
/*@exposed@*//*@null@*/char *pw_encrypt (const char *clear, const char *salt)
|
|
||||||
{
|
|
||||||
static char cipher[128];
|
|
||||||
char *cp;
|
|
||||||
|
|
||||||
cp = crypt (clear, salt);
|
|
||||||
if (NULL == cp) {
|
|
||||||
/*
|
|
||||||
* Single Unix Spec: crypt() may return a null pointer,
|
|
||||||
* and set errno to indicate an error. In this case return
|
|
||||||
* the NULL so the caller can handle appropriately.
|
|
||||||
*/
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Some crypt() do not return NULL if the algorithm is not
|
|
||||||
* supported, and return a DES encrypted password. */
|
|
||||||
if ((NULL != salt) && (salt[0] == '$') && (strlen (cp) <= 13))
|
|
||||||
{
|
|
||||||
/*@observer@*/const char *method;
|
|
||||||
switch (salt[1])
|
|
||||||
{
|
|
||||||
case '1':
|
|
||||||
method = "MD5";
|
|
||||||
break;
|
|
||||||
case '2':
|
|
||||||
method = "BCRYPT";
|
|
||||||
break;
|
|
||||||
case '5':
|
|
||||||
method = "SHA256";
|
|
||||||
break;
|
|
||||||
case '6':
|
|
||||||
method = "SHA512";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
static char nummethod[4] = "$x$";
|
|
||||||
nummethod[1] = salt[1];
|
|
||||||
method = &nummethod[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(void) fprintf (stderr,
|
|
||||||
_("crypt method not supported by libcrypt? (%s)\n"),
|
|
||||||
method);
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strlen (cp) != 13) {
|
|
||||||
return cp; /* nonstandard crypt() in libc, better bail out */
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy (cipher, cp);
|
|
||||||
|
|
||||||
return cipher;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2005 - 2006, Tomasz Kłoczko
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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$ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Exit codes used by shadow programs
|
|
||||||
*/
|
|
||||||
#define E_SUCCESS EXIT_SUCCESS /* success */
|
|
||||||
/*
|
|
||||||
* FIXME: other values should differ from EXIT_FAILURE (and EXIT_SUCCESS).
|
|
||||||
*
|
|
||||||
* FIXME: reserve EXIT_FAILURE for internal failures.
|
|
||||||
*/
|
|
||||||
#define E_NOPERM 1 /* permission denied */
|
|
||||||
#define E_USAGE 2 /* invalid command syntax */
|
|
||||||
#define E_BAD_ARG 3 /* invalid argument to option */
|
|
||||||
#define E_PASSWD_NOTFOUND 14 /* not found password file */
|
|
||||||
#define E_SHADOW_NOTFOUND 15 /* not found shadow password file */
|
|
||||||
#define E_GROUP_NOTFOUND 16 /* not found group file */
|
|
||||||
#define E_GSHADOW_NOTFOUND 17 /* not found shadow group file */
|
|
||||||
#define E_CMD_NOEXEC 126 /* can't run command/shell */
|
|
||||||
#define E_CMD_NOTFOUND 127 /* can't find command/shell to run */
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1989 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1997, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* faillog.h - login failure logging file format
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* The login failure file is maintained by login(1) and faillog(8)
|
|
||||||
* Each record in the file represents a separate UID and the file
|
|
||||||
* is indexed in that fashion.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _FAILLOG_H
|
|
||||||
#define _FAILLOG_H
|
|
||||||
|
|
||||||
struct faillog {
|
|
||||||
short fail_cnt; /* failures since last success */
|
|
||||||
short fail_max; /* failures before turning account off */
|
|
||||||
char fail_line[12]; /* last failure occured here */
|
|
||||||
time_t fail_time; /* last failure occured then */
|
|
||||||
/*
|
|
||||||
* If nonzero, the account will be re-enabled if there are no
|
|
||||||
* failures for fail_locktime seconds since last failure.
|
|
||||||
*/
|
|
||||||
long fail_locktime;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
-130
@@ -1,130 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 , Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1997, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2003 - 2005, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "prototypes.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* valid_field - insure that a field contains all legal characters
|
|
||||||
*
|
|
||||||
* The supplied field is scanned for non-printable and other illegal
|
|
||||||
* characters.
|
|
||||||
* + -1 is returned if an illegal character is present.
|
|
||||||
* + 1 is returned if no illegal characters are present, but the field
|
|
||||||
* contains a non-printable character.
|
|
||||||
* + 0 is returned otherwise.
|
|
||||||
*/
|
|
||||||
int valid_field (const char *field, const char *illegal)
|
|
||||||
{
|
|
||||||
const char *cp;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
if (NULL == field) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For each character of field, search if it appears in the list
|
|
||||||
* of illegal characters. */
|
|
||||||
for (cp = field; '\0' != *cp; cp++) {
|
|
||||||
if (strchr (illegal, *cp) != NULL) {
|
|
||||||
err = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == err) {
|
|
||||||
/* Search if there are some non-printable characters */
|
|
||||||
for (cp = field; '\0' != *cp; cp++) {
|
|
||||||
if (!isprint (*cp)) {
|
|
||||||
err = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* change_field - change a single field if a new value is given.
|
|
||||||
*
|
|
||||||
* prompt the user with the name of the field being changed and the
|
|
||||||
* current value.
|
|
||||||
*/
|
|
||||||
void change_field (char *buf, size_t maxsize, const char *prompt)
|
|
||||||
{
|
|
||||||
char newf[200];
|
|
||||||
char *cp;
|
|
||||||
|
|
||||||
if (maxsize > sizeof (newf)) {
|
|
||||||
maxsize = sizeof (newf);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf ("\t%s [%s]: ", prompt, buf);
|
|
||||||
(void) fflush (stdout);
|
|
||||||
if (fgets (newf, (int) maxsize, stdin) != newf) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cp = strchr (newf, '\n');
|
|
||||||
if (NULL == cp) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*cp = '\0';
|
|
||||||
|
|
||||||
if ('\0' != newf[0]) {
|
|
||||||
/*
|
|
||||||
* Remove leading and trailing whitespace. This also
|
|
||||||
* makes it possible to change the field to empty, by
|
|
||||||
* entering a space. --marekm
|
|
||||||
*/
|
|
||||||
|
|
||||||
while (--cp >= newf && isspace (*cp));
|
|
||||||
cp++;
|
|
||||||
*cp = '\0';
|
|
||||||
|
|
||||||
cp = newf;
|
|
||||||
while (('\0' != *cp) && isspace (*cp)) {
|
|
||||||
cp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy (buf, cp, maxsize - 1);
|
|
||||||
buf[maxsize - 1] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1999, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2008 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 "defines.h"
|
|
||||||
#include "prototypes.h"
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
|
|
||||||
/*@null@*/char *fgetsx (/*@returned@*/ /*@out@*/char *buf, int cnt, FILE * f)
|
|
||||||
{
|
|
||||||
char *cp = buf;
|
|
||||||
char *ep;
|
|
||||||
|
|
||||||
while (cnt > 0) {
|
|
||||||
if (fgets (cp, cnt, f) != cp) {
|
|
||||||
if (cp == buf) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ep = strrchr (cp, '\\');
|
|
||||||
if ((NULL != ep) && (*(ep + 1) == '\n')) {
|
|
||||||
cnt -= ep - cp;
|
|
||||||
if (cnt > 0) {
|
|
||||||
cp = ep;
|
|
||||||
*cp = '\0';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fputsx (const char *s, FILE * stream)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; '\0' != *s; i++, s++) {
|
|
||||||
if (putc (*s, stream) == EOF) {
|
|
||||||
return EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0 /* The standard getgr*() can't handle that. --marekm */
|
|
||||||
if (i > (BUFSIZ / 2)) {
|
|
||||||
if (putc ('\\', stream) == EOF ||
|
|
||||||
putc ('\n', stream) == EOF)
|
|
||||||
return EOF;
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2009 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
|
|
||||||
int get_gid (const char *gidstr, gid_t *gid)
|
|
||||||
{
|
|
||||||
long long int val;
|
|
||||||
char *endptr;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
val = strtoll (gidstr, &endptr, 10);
|
|
||||||
if ( ('\0' == *gidstr)
|
|
||||||
|| ('\0' != *endptr)
|
|
||||||
|| (ERANGE == errno)
|
|
||||||
|| (/*@+longintegral@*/val != (gid_t)val)/*@=longintegral@*/) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*gid = (gid_t)val;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2009 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
|
|
||||||
int get_pid (const char *pidstr, pid_t *pid)
|
|
||||||
{
|
|
||||||
long long int val;
|
|
||||||
char *endptr;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
val = strtoll (pidstr, &endptr, 10);
|
|
||||||
if ( ('\0' == *pidstr)
|
|
||||||
|| ('\0' != *endptr)
|
|
||||||
|| (ERANGE == errno)
|
|
||||||
|| (/*@+longintegral@*/val != (pid_t)val)/*@=longintegral@*/) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*pid = (pid_t)val;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2009 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
|
|
||||||
int get_uid (const char *uidstr, uid_t *uid)
|
|
||||||
{
|
|
||||||
long long int val;
|
|
||||||
char *endptr;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
val = strtoll (uidstr, &endptr, 10);
|
|
||||||
if ( ('\0' == *uidstr)
|
|
||||||
|| ('\0' != *endptr)
|
|
||||||
|| (ERANGE == errno)
|
|
||||||
|| (/*@+longintegral@*/val != (uid_t)val)/*@=longintegral@*/) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*uid = (uid_t)val;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
-631
@@ -1,631 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1991 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2002 - 2006, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 - 2008, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#ifdef USE_ECONF
|
|
||||||
#include <libeconf.h>
|
|
||||||
#endif
|
|
||||||
#include "getdef.h"
|
|
||||||
/*
|
|
||||||
* A configuration item definition.
|
|
||||||
*/
|
|
||||||
struct itemdef {
|
|
||||||
/*@null@*/const char *name; /* name of the item */
|
|
||||||
/*@null@*/char *value; /* value given, or NULL if no value */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define PAMDEFS \
|
|
||||||
{"CHFN_AUTH", NULL}, \
|
|
||||||
{"CHSH_AUTH", NULL}, \
|
|
||||||
{"CRACKLIB_DICTPATH", NULL}, \
|
|
||||||
{"ENV_HZ", NULL}, \
|
|
||||||
{"ENVIRON_FILE", NULL}, \
|
|
||||||
{"ENV_TZ", NULL}, \
|
|
||||||
{"FAILLOG_ENAB", NULL}, \
|
|
||||||
{"FTMP_FILE", NULL}, \
|
|
||||||
{"ISSUE_FILE", NULL}, \
|
|
||||||
{"LASTLOG_ENAB", NULL}, \
|
|
||||||
{"LOGIN_STRING", NULL}, \
|
|
||||||
{"MAIL_CHECK_ENAB", NULL}, \
|
|
||||||
{"MOTD_FILE", NULL}, \
|
|
||||||
{"NOLOGINS_FILE", NULL}, \
|
|
||||||
{"OBSCURE_CHECKS_ENAB", NULL}, \
|
|
||||||
{"PASS_ALWAYS_WARN", NULL}, \
|
|
||||||
{"PASS_CHANGE_TRIES", NULL}, \
|
|
||||||
{"PASS_MAX_LEN", NULL}, \
|
|
||||||
{"PASS_MIN_LEN", NULL}, \
|
|
||||||
{"PORTTIME_CHECKS_ENAB", NULL}, \
|
|
||||||
{"QUOTAS_ENAB", NULL}, \
|
|
||||||
{"SU_WHEEL_ONLY", NULL}, \
|
|
||||||
{"ULIMIT", NULL},
|
|
||||||
|
|
||||||
|
|
||||||
#define NUMDEFS (sizeof(def_table)/sizeof(def_table[0]))
|
|
||||||
static struct itemdef def_table[] = {
|
|
||||||
{"CHFN_RESTRICT", NULL},
|
|
||||||
{"CONSOLE_GROUPS", NULL},
|
|
||||||
{"CONSOLE", NULL},
|
|
||||||
{"CREATE_HOME", NULL},
|
|
||||||
{"DEFAULT_HOME", NULL},
|
|
||||||
{"ENCRYPT_METHOD", NULL},
|
|
||||||
{"ENV_PATH", NULL},
|
|
||||||
{"ENV_SUPATH", NULL},
|
|
||||||
{"ERASECHAR", NULL},
|
|
||||||
{"FAIL_DELAY", NULL},
|
|
||||||
{"FAKE_SHELL", NULL},
|
|
||||||
{"GID_MAX", NULL},
|
|
||||||
{"GID_MIN", NULL},
|
|
||||||
{"HUSHLOGIN_FILE", NULL},
|
|
||||||
{"KILLCHAR", NULL},
|
|
||||||
{"LASTLOG_UID_MAX", NULL},
|
|
||||||
{"LOGIN_RETRIES", NULL},
|
|
||||||
{"LOGIN_TIMEOUT", NULL},
|
|
||||||
{"LOG_OK_LOGINS", NULL},
|
|
||||||
{"LOG_UNKFAIL_ENAB", NULL},
|
|
||||||
{"MAIL_DIR", NULL},
|
|
||||||
{"MAIL_FILE", NULL},
|
|
||||||
{"MAX_MEMBERS_PER_GROUP", NULL},
|
|
||||||
{"MD5_CRYPT_ENAB", NULL},
|
|
||||||
{"PASS_MAX_DAYS", NULL},
|
|
||||||
{"PASS_MIN_DAYS", NULL},
|
|
||||||
{"PASS_WARN_AGE", NULL},
|
|
||||||
#ifdef USE_SHA_CRYPT
|
|
||||||
{"SHA_CRYPT_MAX_ROUNDS", NULL},
|
|
||||||
{"SHA_CRYPT_MIN_ROUNDS", NULL},
|
|
||||||
#endif
|
|
||||||
#ifdef USE_BCRYPT
|
|
||||||
{"BCRYPT_MAX_ROUNDS", NULL},
|
|
||||||
{"BCRYPT_MIN_ROUNDS", NULL},
|
|
||||||
#endif
|
|
||||||
{"SUB_GID_COUNT", NULL},
|
|
||||||
{"SUB_GID_MAX", NULL},
|
|
||||||
{"SUB_GID_MIN", NULL},
|
|
||||||
{"SUB_UID_COUNT", NULL},
|
|
||||||
{"SUB_UID_MAX", NULL},
|
|
||||||
{"SUB_UID_MIN", NULL},
|
|
||||||
{"SULOG_FILE", NULL},
|
|
||||||
{"SU_NAME", NULL},
|
|
||||||
{"SYS_GID_MAX", NULL},
|
|
||||||
{"SYS_GID_MIN", NULL},
|
|
||||||
{"SYS_UID_MAX", NULL},
|
|
||||||
{"SYS_UID_MIN", NULL},
|
|
||||||
{"TTYGROUP", NULL},
|
|
||||||
{"TTYPERM", NULL},
|
|
||||||
{"TTYTYPE_FILE", NULL},
|
|
||||||
{"UID_MAX", NULL},
|
|
||||||
{"UID_MIN", NULL},
|
|
||||||
{"UMASK", NULL},
|
|
||||||
{"USERDEL_CMD", NULL},
|
|
||||||
{"USERGROUPS_ENAB", NULL},
|
|
||||||
#ifndef USE_PAM
|
|
||||||
PAMDEFS
|
|
||||||
#endif
|
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
{"SYSLOG_SG_ENAB", NULL},
|
|
||||||
{"SYSLOG_SU_ENAB", NULL},
|
|
||||||
#endif
|
|
||||||
#ifdef WITH_TCB
|
|
||||||
{"TCB_AUTH_GROUP", NULL},
|
|
||||||
{"TCB_SYMLINKS", NULL},
|
|
||||||
{"USE_TCB", NULL},
|
|
||||||
#endif
|
|
||||||
{"FORCE_SHADOW", NULL},
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NUMKNOWNDEFS (sizeof(knowndef_table)/sizeof(knowndef_table[0]))
|
|
||||||
static struct itemdef knowndef_table[] = {
|
|
||||||
#ifdef USE_PAM
|
|
||||||
PAMDEFS
|
|
||||||
#endif
|
|
||||||
{NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef USE_ECONF
|
|
||||||
#ifdef VENDORDIR
|
|
||||||
static const char* vendordir = VENDORDIR;
|
|
||||||
#else
|
|
||||||
static const char* vendordir = NULL;
|
|
||||||
#endif
|
|
||||||
static const char* sysconfdir = "/etc";
|
|
||||||
#else
|
|
||||||
#ifndef LOGINDEFS
|
|
||||||
#define LOGINDEFS "/etc/login.defs"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const char* def_fname = LOGINDEFS; /* login config defs file */
|
|
||||||
#endif
|
|
||||||
static bool def_loaded = false; /* are defs already loaded? */
|
|
||||||
|
|
||||||
/* local function prototypes */
|
|
||||||
static /*@observer@*/ /*@null@*/struct itemdef *def_find (const char *);
|
|
||||||
static void def_load (void);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getdef_str - get string value from table of definitions.
|
|
||||||
*
|
|
||||||
* Return point to static data for specified item, or NULL if item is not
|
|
||||||
* defined. First time invoked, will load definitions from the file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*@observer@*/ /*@null@*/const char *getdef_str (const char *item)
|
|
||||||
{
|
|
||||||
struct itemdef *d;
|
|
||||||
|
|
||||||
if (!def_loaded) {
|
|
||||||
def_load ();
|
|
||||||
}
|
|
||||||
|
|
||||||
d = def_find (item);
|
|
||||||
return ((NULL == d)? (const char *) NULL : d->value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getdef_bool - get boolean value from table of definitions.
|
|
||||||
*
|
|
||||||
* Return TRUE if specified item is defined as "yes", else FALSE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool getdef_bool (const char *item)
|
|
||||||
{
|
|
||||||
struct itemdef *d;
|
|
||||||
|
|
||||||
if (!def_loaded) {
|
|
||||||
def_load ();
|
|
||||||
}
|
|
||||||
|
|
||||||
d = def_find (item);
|
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (strcasecmp (d->value, "yes") == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getdef_num - get numerical value from table of definitions
|
|
||||||
*
|
|
||||||
* Returns numeric value of specified item, else the "dflt" value if
|
|
||||||
* the item is not defined. Octal (leading "0") and hex (leading "0x")
|
|
||||||
* values are handled.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int getdef_num (const char *item, int dflt)
|
|
||||||
{
|
|
||||||
struct itemdef *d;
|
|
||||||
long val;
|
|
||||||
|
|
||||||
if (!def_loaded) {
|
|
||||||
def_load ();
|
|
||||||
}
|
|
||||||
|
|
||||||
d = def_find (item);
|
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
|
||||||
return dflt;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( (getlong (d->value, &val) == 0)
|
|
||||||
|| (val > INT_MAX)
|
|
||||||
|| (val < INT_MIN)) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("configuration error - cannot parse %s value: '%s'"),
|
|
||||||
item, d->value);
|
|
||||||
return dflt;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (int) val;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getdef_unum - get unsigned numerical value from table of definitions
|
|
||||||
*
|
|
||||||
* Returns numeric value of specified item, else the "dflt" value if
|
|
||||||
* the item is not defined. Octal (leading "0") and hex (leading "0x")
|
|
||||||
* values are handled.
|
|
||||||
*/
|
|
||||||
|
|
||||||
unsigned int getdef_unum (const char *item, unsigned int dflt)
|
|
||||||
{
|
|
||||||
struct itemdef *d;
|
|
||||||
long val;
|
|
||||||
|
|
||||||
if (!def_loaded) {
|
|
||||||
def_load ();
|
|
||||||
}
|
|
||||||
|
|
||||||
d = def_find (item);
|
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
|
||||||
return dflt;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( (getlong (d->value, &val) == 0)
|
|
||||||
|| (val < 0)
|
|
||||||
|| (val > INT_MAX)) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("configuration error - cannot parse %s value: '%s'"),
|
|
||||||
item, d->value);
|
|
||||||
return dflt;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (unsigned int) val;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getdef_long - get long integer value from table of definitions
|
|
||||||
*
|
|
||||||
* Returns numeric value of specified item, else the "dflt" value if
|
|
||||||
* the item is not defined. Octal (leading "0") and hex (leading "0x")
|
|
||||||
* values are handled.
|
|
||||||
*/
|
|
||||||
|
|
||||||
long getdef_long (const char *item, long dflt)
|
|
||||||
{
|
|
||||||
struct itemdef *d;
|
|
||||||
long val;
|
|
||||||
|
|
||||||
if (!def_loaded) {
|
|
||||||
def_load ();
|
|
||||||
}
|
|
||||||
|
|
||||||
d = def_find (item);
|
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
|
||||||
return dflt;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getlong (d->value, &val) == 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("configuration error - cannot parse %s value: '%s'"),
|
|
||||||
item, d->value);
|
|
||||||
return dflt;
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getdef_ulong - get unsigned long numerical value from table of definitions
|
|
||||||
*
|
|
||||||
* Returns numeric value of specified item, else the "dflt" value if
|
|
||||||
* the item is not defined. Octal (leading "0") and hex (leading "0x")
|
|
||||||
* values are handled.
|
|
||||||
*/
|
|
||||||
|
|
||||||
unsigned long getdef_ulong (const char *item, unsigned long dflt)
|
|
||||||
{
|
|
||||||
struct itemdef *d;
|
|
||||||
unsigned long val;
|
|
||||||
|
|
||||||
if (!def_loaded) {
|
|
||||||
def_load ();
|
|
||||||
}
|
|
||||||
|
|
||||||
d = def_find (item);
|
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
|
||||||
return dflt;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getulong (d->value, &val) == 0) {
|
|
||||||
/* FIXME: we should have a getulong */
|
|
||||||
fprintf (stderr,
|
|
||||||
_("configuration error - cannot parse %s value: '%s'"),
|
|
||||||
item, d->value);
|
|
||||||
return dflt;
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* putdef_str - override the value read from /etc/login.defs
|
|
||||||
* (also used when loading the initial defaults)
|
|
||||||
*/
|
|
||||||
|
|
||||||
int putdef_str (const char *name, const char *value)
|
|
||||||
{
|
|
||||||
struct itemdef *d;
|
|
||||||
char *cp;
|
|
||||||
|
|
||||||
if (!def_loaded) {
|
|
||||||
def_load ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Locate the slot to save the value. If this parameter
|
|
||||||
* is unknown then "def_find" will print an err message.
|
|
||||||
*/
|
|
||||||
d = def_find (name);
|
|
||||||
if (NULL == d) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Save off the value.
|
|
||||||
*/
|
|
||||||
cp = strdup (value);
|
|
||||||
if (NULL == cp) {
|
|
||||||
(void) fputs (_("Could not allocate space for config info.\n"),
|
|
||||||
stderr);
|
|
||||||
SYSLOG ((LOG_ERR, "could not allocate space for config info"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NULL != d->value) {
|
|
||||||
free (d->value);
|
|
||||||
}
|
|
||||||
|
|
||||||
d->value = cp;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* def_find - locate named item in table
|
|
||||||
*
|
|
||||||
* Search through a table of configurable items to locate the
|
|
||||||
* specified configuration option.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static /*@observer@*/ /*@null@*/struct itemdef *def_find (const char *name)
|
|
||||||
{
|
|
||||||
struct itemdef *ptr;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Search into the table.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (ptr = def_table; NULL != ptr->name; ptr++) {
|
|
||||||
if (strcmp (ptr->name, name) == 0) {
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Item was never found.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (ptr = knowndef_table; NULL != ptr->name; ptr++) {
|
|
||||||
if (strcmp (ptr->name, name) == 0) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf (stderr,
|
|
||||||
_("configuration error - unknown item '%s' (notify administrator)\n"),
|
|
||||||
name);
|
|
||||||
SYSLOG ((LOG_CRIT, "unknown configuration item `%s'", name));
|
|
||||||
|
|
||||||
out:
|
|
||||||
return (struct itemdef *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* setdef_config_file - set the default configuration file path
|
|
||||||
*
|
|
||||||
* must be called prior to any def* calls.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void setdef_config_file (const char* file)
|
|
||||||
{
|
|
||||||
#ifdef USE_ECONF
|
|
||||||
size_t len;
|
|
||||||
char* cp;
|
|
||||||
|
|
||||||
len = strlen(file) + strlen(sysconfdir) + 2;
|
|
||||||
cp = malloc(len);
|
|
||||||
if (cp == NULL)
|
|
||||||
exit (13);
|
|
||||||
snprintf(cp, len, "%s/%s", file, sysconfdir);
|
|
||||||
sysconfdir = cp;
|
|
||||||
#ifdef VENDORDIR
|
|
||||||
len = strlen(file) + strlen(vendordir) + 2;
|
|
||||||
cp = malloc(len);
|
|
||||||
if (cp == NULL)
|
|
||||||
exit (13);
|
|
||||||
snprintf(cp, len, "%s/%s", file, vendordir);
|
|
||||||
vendordir = cp;
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
def_fname = file;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* def_load - load configuration table
|
|
||||||
*
|
|
||||||
* Loads the user-configured options from the default configuration file
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void def_load (void)
|
|
||||||
{
|
|
||||||
#ifdef USE_ECONF
|
|
||||||
econf_file *defs_file = NULL;
|
|
||||||
econf_err error;
|
|
||||||
char **keys;
|
|
||||||
size_t key_number;
|
|
||||||
#else
|
|
||||||
int i;
|
|
||||||
FILE *fp;
|
|
||||||
char buf[1024], *name, *value, *s;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the initialized flag.
|
|
||||||
* (do it early to prevent recursion in putdef_str())
|
|
||||||
*/
|
|
||||||
def_loaded = true;
|
|
||||||
|
|
||||||
#ifdef USE_ECONF
|
|
||||||
|
|
||||||
error = econf_readDirs (&defs_file, vendordir, sysconfdir, "login", "defs", " \t", "#");
|
|
||||||
if (error) {
|
|
||||||
if (error == ECONF_NOFILE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
SYSLOG ((LOG_CRIT, "cannot open login definitions [%s]",
|
|
||||||
econf_errString(error)));
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((error = econf_getKeys(defs_file, NULL, &key_number, &keys))) {
|
|
||||||
SYSLOG ((LOG_CRIT, "cannot read login definitions [%s]",
|
|
||||||
econf_errString(error)));
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = 0; i < key_number; i++) {
|
|
||||||
char *value;
|
|
||||||
|
|
||||||
econf_getStringValue(defs_file, NULL, keys[i], &value);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Store the value in def_table.
|
|
||||||
*
|
|
||||||
* Ignore failures to load the login.defs file.
|
|
||||||
* The error was already reported to the user and to
|
|
||||||
* syslog. The tools will just use their default values.
|
|
||||||
*/
|
|
||||||
(void)putdef_str (keys[i], value);
|
|
||||||
}
|
|
||||||
|
|
||||||
econf_free (keys);
|
|
||||||
econf_free (defs_file);
|
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* Open the configuration definitions file.
|
|
||||||
*/
|
|
||||||
fp = fopen (def_fname, "r");
|
|
||||||
if (NULL == fp) {
|
|
||||||
if (errno == ENOENT)
|
|
||||||
return;
|
|
||||||
|
|
||||||
int err = errno;
|
|
||||||
SYSLOG ((LOG_CRIT, "cannot open login definitions %s [%s]",
|
|
||||||
def_fname, strerror (err)));
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Go through all of the lines in the file.
|
|
||||||
*/
|
|
||||||
while (fgets (buf, (int) sizeof (buf), fp) != NULL) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Trim trailing whitespace.
|
|
||||||
*/
|
|
||||||
for (i = (int) strlen (buf) - 1; i >= 0; --i) {
|
|
||||||
if (!isspace (buf[i])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
buf[i] = '\0';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Break the line into two fields.
|
|
||||||
*/
|
|
||||||
name = buf + strspn (buf, " \t"); /* first nonwhite */
|
|
||||||
if (*name == '\0' || *name == '#')
|
|
||||||
continue; /* comment or empty */
|
|
||||||
|
|
||||||
s = name + strcspn (name, " \t"); /* end of field */
|
|
||||||
if (*s == '\0')
|
|
||||||
continue; /* only 1 field?? */
|
|
||||||
|
|
||||||
*s++ = '\0';
|
|
||||||
value = s + strspn (s, " \"\t"); /* next nonwhite */
|
|
||||||
*(value + strcspn (value, "\"")) = '\0';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Store the value in def_table.
|
|
||||||
*
|
|
||||||
* Ignore failures to load the login.defs file.
|
|
||||||
* The error was already reported to the user and to
|
|
||||||
* syslog. The tools will just use their default values.
|
|
||||||
*/
|
|
||||||
(void)putdef_str (name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ferror (fp) != 0) {
|
|
||||||
int err = errno;
|
|
||||||
SYSLOG ((LOG_CRIT, "cannot read login definitions %s [%s]",
|
|
||||||
def_fname, strerror (err)));
|
|
||||||
exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void) fclose (fp);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CKDEFS
|
|
||||||
int main (int argc, char **argv)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *cp;
|
|
||||||
struct itemdef *d;
|
|
||||||
|
|
||||||
def_load ();
|
|
||||||
|
|
||||||
for (i = 0; i < NUMDEFS; ++i) {
|
|
||||||
d = def_find (def_table[i].name);
|
|
||||||
if (NULL == d) {
|
|
||||||
printf ("error - lookup '%s' failed\n",
|
|
||||||
def_table[i].name);
|
|
||||||
} else {
|
|
||||||
printf ("%4d %-24s %s\n", i + 1, d->name, d->value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (i = 1; i < argc; i++) {
|
|
||||||
cp = getdef_str (argv[1]);
|
|
||||||
if (NULL != cp) {
|
|
||||||
printf ("%s `%s'\n", argv[1], cp);
|
|
||||||
} else {
|
|
||||||
printf ("%s not found\n", argv[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exit (EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1991 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2002 - 2006, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2008 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 _GETDEF_H
|
|
||||||
#define _GETDEF_H
|
|
||||||
|
|
||||||
/* getdef.c */
|
|
||||||
extern bool getdef_bool (const char *);
|
|
||||||
extern long getdef_long (const char *, long);
|
|
||||||
extern int getdef_num (const char *, int);
|
|
||||||
extern unsigned long getdef_ulong (const char *, unsigned long);
|
|
||||||
extern unsigned int getdef_unum (const char *, unsigned int);
|
|
||||||
extern /*@observer@*/ /*@null@*/const char *getdef_str (const char *);
|
|
||||||
extern int putdef_str (const char *, const char *);
|
|
||||||
extern void setdef_config_file (const char* file);
|
|
||||||
|
|
||||||
/* default UMASK value if not specified in /etc/login.defs */
|
|
||||||
#define GETDEF_DEFAULT_UMASK 022
|
|
||||||
|
|
||||||
#endif /* _GETDEF_H */
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2007 - 2009, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "prototypes.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getlong - extract a long integer provided by the numstr string in *result
|
|
||||||
*
|
|
||||||
* It supports decimal, hexadecimal or octal representations.
|
|
||||||
*
|
|
||||||
* Returns 0 on failure, 1 on success.
|
|
||||||
*/
|
|
||||||
int getlong (const char *numstr, /*@out@*/long int *result)
|
|
||||||
{
|
|
||||||
long val;
|
|
||||||
char *endptr;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
val = strtol (numstr, &endptr, 0);
|
|
||||||
if (('\0' == *numstr) || ('\0' != *endptr) || (ERANGE == errno)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*result = val;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2007 - 2009, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id: getlong.c 2763 2009-04-23 09:57:03Z nekral-guest $"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "prototypes.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getulong - extract an unsigned long integer provided by the numstr string in *result
|
|
||||||
*
|
|
||||||
* It supports decimal, hexadecimal or octal representations.
|
|
||||||
*
|
|
||||||
* Returns 0 on failure, 1 on success.
|
|
||||||
*/
|
|
||||||
int getulong (const char *numstr, /*@out@*/unsigned long int *result)
|
|
||||||
{
|
|
||||||
unsigned long int val;
|
|
||||||
char *endptr;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
val = strtoul (numstr, &endptr, 0);
|
|
||||||
if ( ('\0' == *numstr)
|
|
||||||
|| ('\0' != *endptr)
|
|
||||||
|| (ERANGE == errno)
|
|
||||||
) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*result = val;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
-463
@@ -1,463 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2001 , Michał Moskal
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 - 2010, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "commonio.h"
|
|
||||||
#include "getdef.h"
|
|
||||||
#include "groupio.h"
|
|
||||||
|
|
||||||
static /*@null@*/struct commonio_entry *merge_group_entries (
|
|
||||||
/*@null@*/ /*@returned@*/struct commonio_entry *gr1,
|
|
||||||
/*@null@*/struct commonio_entry *gr2);
|
|
||||||
static int split_groups (unsigned int max_members);
|
|
||||||
static int group_open_hook (void);
|
|
||||||
|
|
||||||
static /*@null@*/ /*@only@*/void *group_dup (const void *ent)
|
|
||||||
{
|
|
||||||
const struct group *gr = ent;
|
|
||||||
|
|
||||||
return __gr_dup (gr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void group_free (/*@out@*/ /*@only@*/void *ent)
|
|
||||||
{
|
|
||||||
struct group *gr = ent;
|
|
||||||
|
|
||||||
gr_free (gr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *group_getname (const void *ent)
|
|
||||||
{
|
|
||||||
const struct group *gr = ent;
|
|
||||||
|
|
||||||
return gr->gr_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *group_parse (const char *line)
|
|
||||||
{
|
|
||||||
return (void *) sgetgrent (line);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int group_put (const void *ent, FILE * file)
|
|
||||||
{
|
|
||||||
const struct group *gr = ent;
|
|
||||||
|
|
||||||
if ( (NULL == gr)
|
|
||||||
|| (valid_field (gr->gr_name, ":\n") == -1)
|
|
||||||
|| (valid_field (gr->gr_passwd, ":\n") == -1)
|
|
||||||
|| (gr->gr_gid == (gid_t)-1)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FIXME: fail also if gr->gr_mem == NULL ?*/
|
|
||||||
if (NULL != gr->gr_mem) {
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; NULL != gr->gr_mem[i]; i++) {
|
|
||||||
if (valid_field (gr->gr_mem[i], ",:\n") == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (putgrent (gr, file) == -1) ? -1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int group_close_hook (void)
|
|
||||||
{
|
|
||||||
unsigned int max_members = getdef_unum("MAX_MEMBERS_PER_GROUP", 0);
|
|
||||||
|
|
||||||
if (0 == max_members) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return split_groups (max_members);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct commonio_ops group_ops = {
|
|
||||||
group_dup,
|
|
||||||
group_free,
|
|
||||||
group_getname,
|
|
||||||
group_parse,
|
|
||||||
group_put,
|
|
||||||
fgetsx,
|
|
||||||
fputsx,
|
|
||||||
group_open_hook,
|
|
||||||
group_close_hook
|
|
||||||
};
|
|
||||||
|
|
||||||
static /*@owned@*/struct commonio_db group_db = {
|
|
||||||
GROUP_FILE, /* filename */
|
|
||||||
&group_ops, /* ops */
|
|
||||||
NULL, /* fp */
|
|
||||||
#ifdef WITH_SELINUX
|
|
||||||
NULL, /* scontext */
|
|
||||||
#endif
|
|
||||||
0644, /* st_mode */
|
|
||||||
0, /* st_uid */
|
|
||||||
0, /* st_gid */
|
|
||||||
NULL, /* head */
|
|
||||||
NULL, /* tail */
|
|
||||||
NULL, /* cursor */
|
|
||||||
false, /* changed */
|
|
||||||
false, /* isopen */
|
|
||||||
false, /* locked */
|
|
||||||
false, /* readonly */
|
|
||||||
false /* setname */
|
|
||||||
};
|
|
||||||
|
|
||||||
int gr_setdbname (const char *filename)
|
|
||||||
{
|
|
||||||
return commonio_setname (&group_db, filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/const char *gr_dbname (void)
|
|
||||||
{
|
|
||||||
return group_db.filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
int gr_lock (void)
|
|
||||||
{
|
|
||||||
return commonio_lock (&group_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
int gr_open (int mode)
|
|
||||||
{
|
|
||||||
return commonio_open (&group_db, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/ /*@null@*/const struct group *gr_locate (const char *name)
|
|
||||||
{
|
|
||||||
return commonio_locate (&group_db, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/ /*@null@*/const struct group *gr_locate_gid (gid_t gid)
|
|
||||||
{
|
|
||||||
const struct group *grp;
|
|
||||||
|
|
||||||
gr_rewind ();
|
|
||||||
while ( ((grp = gr_next ()) != NULL)
|
|
||||||
&& (grp->gr_gid != gid)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return grp;
|
|
||||||
}
|
|
||||||
|
|
||||||
int gr_update (const struct group *gr)
|
|
||||||
{
|
|
||||||
return commonio_update (&group_db, (const void *) gr);
|
|
||||||
}
|
|
||||||
|
|
||||||
int gr_remove (const char *name)
|
|
||||||
{
|
|
||||||
return commonio_remove (&group_db, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
int gr_rewind (void)
|
|
||||||
{
|
|
||||||
return commonio_rewind (&group_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/ /*@null@*/const struct group *gr_next (void)
|
|
||||||
{
|
|
||||||
return commonio_next (&group_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
int gr_close (void)
|
|
||||||
{
|
|
||||||
return commonio_close (&group_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
int gr_unlock (void)
|
|
||||||
{
|
|
||||||
return commonio_unlock (&group_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
void __gr_set_changed (void)
|
|
||||||
{
|
|
||||||
group_db.changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@dependent@*/ /*@null@*/struct commonio_entry *__gr_get_head (void)
|
|
||||||
{
|
|
||||||
return group_db.head;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/const struct commonio_db *__gr_get_db (void)
|
|
||||||
{
|
|
||||||
return &group_db;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __gr_del_entry (const struct commonio_entry *ent)
|
|
||||||
{
|
|
||||||
commonio_del_entry (&group_db, ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int gr_cmp (const void *p1, const void *p2)
|
|
||||||
{
|
|
||||||
gid_t u1, u2;
|
|
||||||
|
|
||||||
if ((*(struct commonio_entry **) p1)->eptr == NULL) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if ((*(struct commonio_entry **) p2)->eptr == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
u1 = ((struct group *) (*(struct commonio_entry **) p1)->eptr)->gr_gid;
|
|
||||||
u2 = ((struct group *) (*(struct commonio_entry **) p2)->eptr)->gr_gid;
|
|
||||||
|
|
||||||
if (u1 < u2) {
|
|
||||||
return -1;
|
|
||||||
} else if (u1 > u2) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sort entries by GID */
|
|
||||||
int gr_sort ()
|
|
||||||
{
|
|
||||||
return commonio_sort (&group_db, gr_cmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int group_open_hook (void)
|
|
||||||
{
|
|
||||||
unsigned int max_members = getdef_unum("MAX_MEMBERS_PER_GROUP", 0);
|
|
||||||
struct commonio_entry *gr1, *gr2;
|
|
||||||
|
|
||||||
if (0 == max_members) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (gr1 = group_db.head; NULL != gr1; gr1 = gr1->next) {
|
|
||||||
for (gr2 = gr1->next; NULL != gr2; gr2 = gr2->next) {
|
|
||||||
struct group *g1 = (struct group *)gr1->eptr;
|
|
||||||
struct group *g2 = (struct group *)gr2->eptr;
|
|
||||||
if (NULL != g1 &&
|
|
||||||
NULL != g2 &&
|
|
||||||
0 == strcmp (g1->gr_name, g2->gr_name) &&
|
|
||||||
0 == strcmp (g1->gr_passwd, g2->gr_passwd) &&
|
|
||||||
g1->gr_gid == g2->gr_gid) {
|
|
||||||
/* Both group entries refer to the same
|
|
||||||
* group. It is a split group. Merge the
|
|
||||||
* members. */
|
|
||||||
gr1 = merge_group_entries (gr1, gr2);
|
|
||||||
if (NULL == gr1)
|
|
||||||
return 0;
|
|
||||||
/* Unlink gr2 */
|
|
||||||
if (NULL != gr2->next) {
|
|
||||||
gr2->next->prev = gr2->prev;
|
|
||||||
}
|
|
||||||
/* gr2 does not start with head */
|
|
||||||
assert (NULL != gr2->prev);
|
|
||||||
gr2->prev->next = gr2->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assert (NULL != gr1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Merge the list of members of the two group entries.
|
|
||||||
*
|
|
||||||
* The commonio_entry arguments shall be group entries.
|
|
||||||
*
|
|
||||||
* You should not merge the members of two groups if they don't have the
|
|
||||||
* same name, password and gid.
|
|
||||||
*
|
|
||||||
* It merge the members of the second entry in the first one, and return
|
|
||||||
* the modified first entry on success, or NULL on failure (with errno
|
|
||||||
* set).
|
|
||||||
*/
|
|
||||||
static /*@null@*/struct commonio_entry *merge_group_entries (
|
|
||||||
/*@null@*/ /*@returned@*/struct commonio_entry *gr1,
|
|
||||||
/*@null@*/struct commonio_entry *gr2)
|
|
||||||
{
|
|
||||||
struct group *gptr1;
|
|
||||||
struct group *gptr2;
|
|
||||||
char **new_members;
|
|
||||||
size_t members = 0;
|
|
||||||
char *new_line;
|
|
||||||
size_t new_line_len, i;
|
|
||||||
if (NULL == gr2 || NULL == gr1) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
gptr1 = (struct group *)gr1->eptr;
|
|
||||||
gptr2 = (struct group *)gr2->eptr;
|
|
||||||
if (NULL == gptr2 || NULL == gptr1) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Concatenate the 2 lines */
|
|
||||||
new_line_len = strlen (gr1->line) + strlen (gr2->line) +1;
|
|
||||||
new_line = (char *)malloc (new_line_len + 1);
|
|
||||||
if (NULL == new_line) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
snprintf(new_line, new_line_len + 1, "%s\n%s", gr1->line, gr2->line);
|
|
||||||
|
|
||||||
/* Concatenate the 2 list of members */
|
|
||||||
for (i=0; NULL != gptr1->gr_mem[i]; i++);
|
|
||||||
members += i;
|
|
||||||
for (i=0; NULL != gptr2->gr_mem[i]; i++) {
|
|
||||||
char **pmember = gptr1->gr_mem;
|
|
||||||
while (NULL != *pmember) {
|
|
||||||
if (0 == strcmp(*pmember, gptr2->gr_mem[i])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pmember++;
|
|
||||||
}
|
|
||||||
if (NULL == *pmember) {
|
|
||||||
members++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
new_members = (char **)calloc ( (members+1), sizeof(char*) );
|
|
||||||
if (NULL == new_members) {
|
|
||||||
free (new_line);
|
|
||||||
errno = ENOMEM;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
for (i=0; NULL != gptr1->gr_mem[i]; i++) {
|
|
||||||
new_members[i] = gptr1->gr_mem[i];
|
|
||||||
}
|
|
||||||
/* NULL termination enforced by above calloc */
|
|
||||||
|
|
||||||
members = i;
|
|
||||||
for (i=0; NULL != gptr2->gr_mem[i]; i++) {
|
|
||||||
char **pmember = new_members;
|
|
||||||
while (NULL != *pmember) {
|
|
||||||
if (0 == strcmp(*pmember, gptr2->gr_mem[i])) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pmember++;
|
|
||||||
}
|
|
||||||
if (NULL == *pmember) {
|
|
||||||
new_members[members] = gptr2->gr_mem[i];
|
|
||||||
members++;
|
|
||||||
new_members[members] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gr1->line = new_line;
|
|
||||||
gptr1->gr_mem = new_members;
|
|
||||||
|
|
||||||
return gr1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Scan the group database and split the groups which have more members
|
|
||||||
* than specified, if this is the result from a current change.
|
|
||||||
*
|
|
||||||
* Return 0 on failure (errno set) and 1 on success.
|
|
||||||
*/
|
|
||||||
static int split_groups (unsigned int max_members)
|
|
||||||
{
|
|
||||||
struct commonio_entry *gr;
|
|
||||||
|
|
||||||
for (gr = group_db.head; NULL != gr; gr = gr->next) {
|
|
||||||
struct group *gptr = (struct group *)gr->eptr;
|
|
||||||
struct commonio_entry *new;
|
|
||||||
struct group *new_gptr;
|
|
||||||
unsigned int members = 0;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
/* Check if this group must be split */
|
|
||||||
if (!gr->changed) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (NULL == gptr) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (members = 0; NULL != gptr->gr_mem[members]; members++);
|
|
||||||
if (members <= max_members) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
new = (struct commonio_entry *) malloc (sizeof *new);
|
|
||||||
if (NULL == new) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
new->eptr = group_dup(gr->eptr);
|
|
||||||
if (NULL == new->eptr) {
|
|
||||||
free (new);
|
|
||||||
errno = ENOMEM;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
new_gptr = (struct group *)new->eptr;
|
|
||||||
new->line = NULL;
|
|
||||||
new->changed = true;
|
|
||||||
|
|
||||||
/* Enforce the maximum number of members on gptr */
|
|
||||||
for (i = max_members; NULL != gptr->gr_mem[i]; i++) {
|
|
||||||
free (gptr->gr_mem[i]);
|
|
||||||
gptr->gr_mem[i] = NULL;
|
|
||||||
}
|
|
||||||
/* Shift all the members */
|
|
||||||
/* The number of members in new_gptr will be check later */
|
|
||||||
for (i = 0; NULL != new_gptr->gr_mem[i + max_members]; i++) {
|
|
||||||
if (NULL != new_gptr->gr_mem[i]) {
|
|
||||||
free (new_gptr->gr_mem[i]);
|
|
||||||
}
|
|
||||||
new_gptr->gr_mem[i] = new_gptr->gr_mem[i + max_members];
|
|
||||||
new_gptr->gr_mem[i + max_members] = NULL;
|
|
||||||
}
|
|
||||||
for (; NULL != new_gptr->gr_mem[i]; i++) {
|
|
||||||
free (new_gptr->gr_mem[i]);
|
|
||||||
new_gptr->gr_mem[i] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* insert the new entry in the list */
|
|
||||||
new->prev = gr;
|
|
||||||
new->next = gr->next;
|
|
||||||
gr->next = new;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2001 , Michał Moskal
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2008 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 _GROUPIO_H
|
|
||||||
#define _GROUPIO_H
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <grp.h>
|
|
||||||
|
|
||||||
extern int gr_close (void);
|
|
||||||
extern /*@observer@*/ /*@null@*/const struct group *gr_locate (const char *name);
|
|
||||||
extern /*@observer@*/ /*@null@*/const struct group *gr_locate_gid (gid_t gid);
|
|
||||||
extern int gr_lock (void);
|
|
||||||
extern int gr_setdbname (const char *filename);
|
|
||||||
extern /*@observer@*/const char *gr_dbname (void);
|
|
||||||
extern /*@observer@*/ /*@null@*/const struct group *gr_next (void);
|
|
||||||
extern int gr_open (int mode);
|
|
||||||
extern int gr_remove (const char *name);
|
|
||||||
extern int gr_rewind (void);
|
|
||||||
extern int gr_unlock (void);
|
|
||||||
extern int gr_update (const struct group *gr);
|
|
||||||
extern int gr_sort (void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
-106
@@ -1,106 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2001 , Michał Moskal
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 - 2013, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "groupio.h"
|
|
||||||
|
|
||||||
/*@null@*/ /*@only@*/struct group *__gr_dup (const struct group *grent)
|
|
||||||
{
|
|
||||||
struct group *gr;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
gr = (struct group *) malloc (sizeof *gr);
|
|
||||||
if (NULL == gr) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/* The libc might define other fields. They won't be copied. */
|
|
||||||
memset (gr, 0, sizeof *gr);
|
|
||||||
gr->gr_gid = grent->gr_gid;
|
|
||||||
/*@-mustfreeonly@*/
|
|
||||||
gr->gr_name = strdup (grent->gr_name);
|
|
||||||
/*@=mustfreeonly@*/
|
|
||||||
if (NULL == gr->gr_name) {
|
|
||||||
gr_free(gr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/*@-mustfreeonly@*/
|
|
||||||
gr->gr_passwd = strdup (grent->gr_passwd);
|
|
||||||
/*@=mustfreeonly@*/
|
|
||||||
if (NULL == gr->gr_passwd) {
|
|
||||||
gr_free(gr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; grent->gr_mem[i]; i++);
|
|
||||||
|
|
||||||
/*@-mustfreeonly@*/
|
|
||||||
gr->gr_mem = (char **) malloc ((i + 1) * sizeof (char *));
|
|
||||||
/*@=mustfreeonly@*/
|
|
||||||
if (NULL == gr->gr_mem) {
|
|
||||||
gr_free(gr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
for (i = 0; grent->gr_mem[i]; i++) {
|
|
||||||
gr->gr_mem[i] = strdup (grent->gr_mem[i]);
|
|
||||||
if (NULL == gr->gr_mem[i]) {
|
|
||||||
gr_free(gr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gr->gr_mem[i] = NULL;
|
|
||||||
|
|
||||||
return gr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void gr_free (/*@out@*/ /*@only@*/struct group *grent)
|
|
||||||
{
|
|
||||||
free (grent->gr_name);
|
|
||||||
if (NULL != grent->gr_passwd) {
|
|
||||||
memzero (grent->gr_passwd, strlen (grent->gr_passwd));
|
|
||||||
free (grent->gr_passwd);
|
|
||||||
}
|
|
||||||
if (NULL != grent->gr_mem) {
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; NULL != grent->gr_mem[i]; i++) {
|
|
||||||
free (grent->gr_mem[i]);
|
|
||||||
}
|
|
||||||
free (grent->gr_mem);
|
|
||||||
}
|
|
||||||
free (grent);
|
|
||||||
}
|
|
||||||
|
|
||||||
-529
@@ -1,529 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1998, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2008 - 2009, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
/* Newer versions of Linux libc already have shadow support. */
|
|
||||||
#if defined(SHADOWGRP) && !defined(HAVE_SHADOWGRP) /*{ */
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
static /*@null@*/FILE *shadow;
|
|
||||||
static /*@null@*//*@only@*/char **members = NULL;
|
|
||||||
static size_t nmembers = 0;
|
|
||||||
static /*@null@*//*@only@*/char **admins = NULL;
|
|
||||||
static size_t nadmins = 0;
|
|
||||||
static struct sgrp sgroup;
|
|
||||||
|
|
||||||
#define FIELDS 4
|
|
||||||
|
|
||||||
#ifdef USE_NIS
|
|
||||||
static bool nis_used;
|
|
||||||
static bool nis_ignore;
|
|
||||||
static enum { native, start, middle, native2 } nis_state;
|
|
||||||
static bool nis_bound;
|
|
||||||
static char *nis_domain;
|
|
||||||
static char *nis_key;
|
|
||||||
static int nis_keylen;
|
|
||||||
static char *nis_val;
|
|
||||||
static int nis_vallen;
|
|
||||||
|
|
||||||
#define IS_NISCHAR(c) ((c)=='+')
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_NIS
|
|
||||||
/*
|
|
||||||
* bind_nis - bind to NIS server
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int bind_nis (void)
|
|
||||||
{
|
|
||||||
if (yp_get_default_domain (&nis_domain))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
nis_bound = true;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static /*@null@*/char **build_list (char *s, char **list[], size_t * nlist)
|
|
||||||
{
|
|
||||||
char **ptr = *list;
|
|
||||||
size_t nelem = *nlist, size;
|
|
||||||
|
|
||||||
while (s != NULL && *s != '\0') {
|
|
||||||
size = (nelem + 1) * sizeof (ptr);
|
|
||||||
ptr = realloc (*list, size);
|
|
||||||
if (NULL != ptr) {
|
|
||||||
ptr[nelem] = s;
|
|
||||||
nelem++;
|
|
||||||
*list = ptr;
|
|
||||||
*nlist = nelem;
|
|
||||||
s = strchr (s, ',');
|
|
||||||
if (NULL != s) {
|
|
||||||
*s = '\0';
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
size = (nelem + 1) * sizeof (ptr);
|
|
||||||
ptr = realloc (*list, size);
|
|
||||||
if (NULL != ptr) {
|
|
||||||
ptr[nelem] = NULL;
|
|
||||||
*list = ptr;
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setsgent (void)
|
|
||||||
{
|
|
||||||
#ifdef USE_NIS
|
|
||||||
nis_state = native;
|
|
||||||
#endif
|
|
||||||
if (NULL != shadow) {
|
|
||||||
rewind (shadow);
|
|
||||||
} else {
|
|
||||||
shadow = fopen (SGROUP_FILE, "r");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void endsgent (void)
|
|
||||||
{
|
|
||||||
if (NULL != shadow) {
|
|
||||||
(void) fclose (shadow);
|
|
||||||
}
|
|
||||||
|
|
||||||
shadow = (FILE *) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *sgetsgent (const char *string)
|
|
||||||
{
|
|
||||||
static char *sgrbuf = NULL;
|
|
||||||
static size_t sgrbuflen = 0;
|
|
||||||
|
|
||||||
char *fields[FIELDS];
|
|
||||||
char *cp;
|
|
||||||
int i;
|
|
||||||
size_t len = strlen (string) + 1;
|
|
||||||
|
|
||||||
if (len > sgrbuflen) {
|
|
||||||
char *buf = (char *) realloc (sgrbuf, sizeof (char) * len);
|
|
||||||
if (NULL == buf) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
sgrbuf = buf;
|
|
||||||
sgrbuflen = len;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy (sgrbuf, string, len);
|
|
||||||
sgrbuf[len-1] = '\0';
|
|
||||||
|
|
||||||
cp = strrchr (sgrbuf, '\n');
|
|
||||||
if (NULL != cp) {
|
|
||||||
*cp = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* There should be exactly 4 colon separated fields. Find
|
|
||||||
* all 4 of them and save the starting addresses in fields[].
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (cp = sgrbuf, i = 0; (i < FIELDS) && (NULL != cp); i++) {
|
|
||||||
fields[i] = cp;
|
|
||||||
cp = strchr (cp, ':');
|
|
||||||
if (NULL != cp) {
|
|
||||||
*cp++ = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If there was an extra field somehow, or perhaps not enough,
|
|
||||||
* the line is invalid.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((NULL != cp) || (i != FIELDS)) {
|
|
||||||
#ifdef USE_NIS
|
|
||||||
if (!IS_NISCHAR (fields[0][0])) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
nis_used = true;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
sgroup.sg_name = fields[0];
|
|
||||||
sgroup.sg_passwd = fields[1];
|
|
||||||
if (0 != nadmins) {
|
|
||||||
nadmins = 0;
|
|
||||||
free (admins);
|
|
||||||
admins = NULL;
|
|
||||||
}
|
|
||||||
if (0 != nmembers) {
|
|
||||||
nmembers = 0;
|
|
||||||
free (members);
|
|
||||||
members = NULL;
|
|
||||||
}
|
|
||||||
sgroup.sg_adm = build_list (fields[2], &admins, &nadmins);
|
|
||||||
sgroup.sg_mem = build_list (fields[3], &members, &nmembers);
|
|
||||||
|
|
||||||
return &sgroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fgetsgent - convert next line in stream to (struct sgrp)
|
|
||||||
*
|
|
||||||
* fgetsgent() reads the next line from the provided stream and
|
|
||||||
* converts it to a (struct sgrp). NULL is returned on EOF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *fgetsgent (/*@null@*/FILE * fp)
|
|
||||||
{
|
|
||||||
static size_t buflen = 0;
|
|
||||||
static char *buf = NULL;
|
|
||||||
|
|
||||||
char *cp;
|
|
||||||
|
|
||||||
if (0 == buflen) {
|
|
||||||
buf = (char *) malloc (BUFSIZ);
|
|
||||||
if (NULL == buf) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
buflen = BUFSIZ;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NULL == fp) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_NIS
|
|
||||||
while (fgetsx (buf, (int) buflen, fp) == buf)
|
|
||||||
#else
|
|
||||||
if (fgetsx (buf, (int) buflen, fp) == buf)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
while ( ((cp = strrchr (buf, '\n')) == NULL)
|
|
||||||
&& (feof (fp) == 0)) {
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
cp = (char *) realloc (buf, buflen*2);
|
|
||||||
if (NULL == cp) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
buf = cp;
|
|
||||||
buflen *= 2;
|
|
||||||
|
|
||||||
len = strlen (buf);
|
|
||||||
if (fgetsx (&buf[len],
|
|
||||||
(int) (buflen - len),
|
|
||||||
fp) != &buf[len]) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cp = strrchr (buf, '\n');
|
|
||||||
if (NULL != cp) {
|
|
||||||
*cp = '\0';
|
|
||||||
}
|
|
||||||
#ifdef USE_NIS
|
|
||||||
if (nis_ignore && IS_NISCHAR (buf[0])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return (sgetsgent (buf));
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getsgent - get a single shadow group entry
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *getsgent (void)
|
|
||||||
{
|
|
||||||
#ifdef USE_NIS
|
|
||||||
bool nis_1_group = false;
|
|
||||||
struct sgrp *val;
|
|
||||||
#endif
|
|
||||||
if (NULL == shadow) {
|
|
||||||
setsgent ();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_NIS
|
|
||||||
again:
|
|
||||||
/*
|
|
||||||
* See if we are reading from the local file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (nis_state == native || nis_state == native2) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the next entry from the shadow group file. Return
|
|
||||||
* NULL right away if there is none.
|
|
||||||
*/
|
|
||||||
|
|
||||||
val = fgetsgent (shadow);
|
|
||||||
if (NULL == val) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If this entry began with a NIS escape character, we have
|
|
||||||
* to see if this is just a single group, or if the entire
|
|
||||||
* map is being asked for.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (IS_NISCHAR (val->sg_name[0])) {
|
|
||||||
if ('\0' != val->sg_name[1]) {
|
|
||||||
nis_1_group = true;
|
|
||||||
} else {
|
|
||||||
nis_state = start;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If this isn't a NIS group and this isn't an escape to go
|
|
||||||
* use a NIS map, it must be a regular local group.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!nis_1_group && (nis_state != start)) {
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If this is an escape to use an NIS map, switch over to
|
|
||||||
* that bunch of code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (nis_state == start) {
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NEEDSWORK. Here we substitute pieces-parts of this entry.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
if (!nis_bound) {
|
|
||||||
if (bind_nis ()) {
|
|
||||||
nis_state = native2;
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nis_state == start) {
|
|
||||||
if (yp_first (nis_domain, "gshadow.byname", &nis_key,
|
|
||||||
&nis_keylen, &nis_val, &nis_vallen)) {
|
|
||||||
nis_state = native2;
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
nis_state = middle;
|
|
||||||
} else if (nis_state == middle) {
|
|
||||||
if (yp_next (nis_domain, "gshadow.byname", nis_key,
|
|
||||||
nis_keylen, &nis_key, &nis_keylen,
|
|
||||||
&nis_val, &nis_vallen)) {
|
|
||||||
nis_state = native2;
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sgetsgent (nis_val);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return (fgetsgent (shadow));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getsgnam - get a shadow group entry by name
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *getsgnam (const char *name)
|
|
||||||
{
|
|
||||||
struct sgrp *sgrp;
|
|
||||||
|
|
||||||
#ifdef USE_NIS
|
|
||||||
static char save_name[16];
|
|
||||||
int nis_disabled = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
setsgent ();
|
|
||||||
|
|
||||||
#ifdef USE_NIS
|
|
||||||
if (nis_used) {
|
|
||||||
again:
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Search the gshadow.byname map for this group.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!nis_bound) {
|
|
||||||
bind_nis ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nis_bound) {
|
|
||||||
char *cp;
|
|
||||||
|
|
||||||
if (yp_match (nis_domain, "gshadow.byname", name,
|
|
||||||
strlen (name), &nis_val,
|
|
||||||
&nis_vallen) == 0) {
|
|
||||||
cp = strchr (nis_val, '\n');
|
|
||||||
if (NULL != cp) {
|
|
||||||
*cp = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
nis_state = middle;
|
|
||||||
sgrp = sgetsgent (nis_val);
|
|
||||||
if (NULL != sgrp) {
|
|
||||||
strcpy (save_name, sgrp->sg_name);
|
|
||||||
nis_key = save_name;
|
|
||||||
nis_keylen = strlen (save_name);
|
|
||||||
}
|
|
||||||
return sgrp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nis_state = native2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_NIS
|
|
||||||
if (nis_used) {
|
|
||||||
nis_ignore = true;
|
|
||||||
nis_disabled = true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
while ((sgrp = getsgent ()) != (struct sgrp *) 0) {
|
|
||||||
if (strcmp (name, sgrp->sg_name) == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef USE_NIS
|
|
||||||
nis_ignore = false;
|
|
||||||
#endif
|
|
||||||
return sgrp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* putsgent - output shadow group entry in text form
|
|
||||||
*
|
|
||||||
* putsgent() converts the contents of a (struct sgrp) to text and
|
|
||||||
* writes the result to the given stream. This is the logical
|
|
||||||
* opposite of fgetsgent.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int putsgent (const struct sgrp *sgrp, FILE * fp)
|
|
||||||
{
|
|
||||||
char *buf, *cp;
|
|
||||||
int i;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
if ((NULL == fp) || (NULL == sgrp)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* calculate the required buffer size */
|
|
||||||
size = strlen (sgrp->sg_name) + strlen (sgrp->sg_passwd) + 10;
|
|
||||||
for (i = 0; (NULL != sgrp->sg_adm) && (NULL != sgrp->sg_adm[i]); i++) {
|
|
||||||
size += strlen (sgrp->sg_adm[i]) + 1;
|
|
||||||
}
|
|
||||||
for (i = 0; (NULL != sgrp->sg_mem) && (NULL != sgrp->sg_mem[i]); i++) {
|
|
||||||
size += strlen (sgrp->sg_mem[i]) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = malloc (size);
|
|
||||||
if (NULL == buf) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
cp = buf;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy the group name and passwd.
|
|
||||||
*/
|
|
||||||
|
|
||||||
strcpy (cp, sgrp->sg_name);
|
|
||||||
cp += strlen (cp);
|
|
||||||
*cp++ = ':';
|
|
||||||
|
|
||||||
strcpy (cp, sgrp->sg_passwd);
|
|
||||||
cp += strlen (cp);
|
|
||||||
*cp++ = ':';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copy the administrators, separating each from the other
|
|
||||||
* with a ",".
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i = 0; NULL != sgrp->sg_adm[i]; i++) {
|
|
||||||
if (i > 0) {
|
|
||||||
*cp++ = ',';
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy (cp, sgrp->sg_adm[i]);
|
|
||||||
cp += strlen (cp);
|
|
||||||
}
|
|
||||||
*cp = ':';
|
|
||||||
cp++;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now do likewise with the group members.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i = 0; NULL != sgrp->sg_mem[i]; i++) {
|
|
||||||
if (i > 0) {
|
|
||||||
*cp = ',';
|
|
||||||
cp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy (cp, sgrp->sg_mem[i]);
|
|
||||||
cp += strlen (cp);
|
|
||||||
}
|
|
||||||
*cp = '\n';
|
|
||||||
cp++;
|
|
||||||
*cp = '\0';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Output using the function which understands the line
|
|
||||||
* continuation conventions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (fputsx (buf, fp) == EOF) {
|
|
||||||
free (buf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
free (buf);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
|
||||||
#endif /*} SHADOWGRP */
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1988 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1997, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2003 - 2005, Tomasz Kłoczko
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 _H_GSHADOW
|
|
||||||
#define _H_GSHADOW
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Shadow group security file structure
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct sgrp {
|
|
||||||
char *sg_name; /* group name */
|
|
||||||
char *sg_passwd; /* group password */
|
|
||||||
char **sg_adm; /* group administrator list */
|
|
||||||
char **sg_mem; /* group membership list */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Shadow group security file functions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h> /* for FILE */
|
|
||||||
|
|
||||||
#if __STDC__
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *getsgent (void);
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *getsgnam (const char *);
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *sgetsgent (const char *);
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *fgetsgent (/*@null@*/FILE *);
|
|
||||||
void setsgent (void);
|
|
||||||
void endsgent (void);
|
|
||||||
int putsgent (const struct sgrp *, FILE *);
|
|
||||||
#else
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *getsgent ();
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *getsgnam ();
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *sgetsgent ();
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *fgetsgent ();
|
|
||||||
void setsgent ();
|
|
||||||
void endsgent ();
|
|
||||||
int putsgent ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define GSHADOW "/etc/gshadow"
|
|
||||||
#endif /* ifndef _H_GSHADOW */
|
|
||||||
-108
@@ -1,108 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1992 , Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1998, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ifndef HAVE_LCKPWDF
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "pwio.h"
|
|
||||||
#include "shadowio.h"
|
|
||||||
/*
|
|
||||||
* lckpwdf - lock the password files
|
|
||||||
*/
|
|
||||||
int lckpwdf (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We have 15 seconds to lock the whole mess
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i = 0; i < 15; i++)
|
|
||||||
if (pw_lock ())
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
sleep (1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Did we run out of time?
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (i == 15)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Nope, use any remaining time to lock the shadow password
|
|
||||||
* file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (; i < 15; i++)
|
|
||||||
if (spw_lock ())
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
sleep (1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Out of time yet?
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (i == 15) {
|
|
||||||
pw_unlock ();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Nope - and both files are now locked.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ulckpwdf - unlock the password files
|
|
||||||
*/
|
|
||||||
|
|
||||||
int ulckpwdf (void)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unlock both files.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (pw_unlock () && spw_unlock ())? 0 : -1;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
|
||||||
#endif
|
|
||||||
-57
@@ -1,57 +0,0 @@
|
|||||||
/* Author: Peter Vrabec <pvrabec@redhat.com> */
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#ifdef USE_NSCD
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include "exitcodes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "nscd.h"
|
|
||||||
|
|
||||||
#define MSG_NSCD_FLUSH_CACHE_FAILED "%s: Failed to flush the nscd cache.\n"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* nscd_flush_cache - flush specified service buffer in nscd cache
|
|
||||||
*/
|
|
||||||
int nscd_flush_cache (const char *service)
|
|
||||||
{
|
|
||||||
int status, code;
|
|
||||||
const char *cmd = "/usr/sbin/nscd";
|
|
||||||
const char *spawnedArgs[] = {"nscd", "-i", service, NULL};
|
|
||||||
const char *spawnedEnv[] = {NULL};
|
|
||||||
|
|
||||||
if (run_command (cmd, spawnedArgs, spawnedEnv, &status) != 0) {
|
|
||||||
/* run_command writes its own more detailed message. */
|
|
||||||
(void) fprintf (stderr, _(MSG_NSCD_FLUSH_CACHE_FAILED), Prog);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
code = WEXITSTATUS (status);
|
|
||||||
if (!WIFEXITED (status)) {
|
|
||||||
(void) fprintf (stderr,
|
|
||||||
_("%s: nscd did not terminate normally (signal %d)\n"),
|
|
||||||
Prog, WTERMSIG (status));
|
|
||||||
return -1;
|
|
||||||
} else if (code == E_CMD_NOTFOUND) {
|
|
||||||
/* nscd is not installed, or it is installed but uses an
|
|
||||||
interpreter that is missing. Probably the former. */
|
|
||||||
return 0;
|
|
||||||
} else if (code == 1) {
|
|
||||||
/* nscd is installed, but it isn't active. */
|
|
||||||
return 0;
|
|
||||||
} else if (code != 0) {
|
|
||||||
(void) fprintf (stderr, _("%s: nscd exited with status %d\n"),
|
|
||||||
Prog, code);
|
|
||||||
(void) fprintf (stderr, _(MSG_NSCD_FLUSH_CACHE_FAILED), Prog);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else /* USE_NSCD */
|
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
|
||||||
#endif /* USE_NSCD */
|
|
||||||
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
#ifndef _NSCD_H_
|
|
||||||
#define _NSCD_H_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* nscd_flush_cache - flush specified service buffer in nscd cache
|
|
||||||
*/
|
|
||||||
#ifdef USE_NSCD
|
|
||||||
extern int nscd_flush_cache (const char *service);
|
|
||||||
#else
|
|
||||||
#define nscd_flush_cache(service) (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1999 , Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2001 - 2005, Tomasz Kłoczko
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 <security/pam_appl.h>
|
|
||||||
#ifdef HAVE_SECURITY_PAM_MISC_H
|
|
||||||
# include <security/pam_misc.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SECURITY_OPENPAM_H
|
|
||||||
# include <security/openpam.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static struct pam_conv conv = {
|
|
||||||
SHADOW_PAM_CONVERSATION,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
/* compatibility with different versions of Linux-PAM */
|
|
||||||
#if !HAVE_DECL_PAM_ESTABLISH_CRED
|
|
||||||
#define PAM_ESTABLISH_CRED PAM_CRED_ESTABLISH
|
|
||||||
#endif
|
|
||||||
#if !HAVE_DECL_PAM_DELETE_CRED
|
|
||||||
#define PAM_DELETE_CRED PAM_CRED_DELETE
|
|
||||||
#endif
|
|
||||||
#if !HAVE_DECL_PAM_NEW_AUTHTOK_REQD
|
|
||||||
#define PAM_NEW_AUTHTOK_REQD PAM_AUTHTOKEN_REQD
|
|
||||||
#endif
|
|
||||||
#if !HAVE_DECL_PAM_DATA_SILENT
|
|
||||||
#define PAM_DATA_SILENT 0
|
|
||||||
#endif
|
|
||||||
-477
@@ -1,477 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1989 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1997, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2008 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "defines.h"
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "port.h"
|
|
||||||
|
|
||||||
static FILE *ports;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* portcmp - compare the name of a port to a /etc/porttime entry
|
|
||||||
*
|
|
||||||
* portcmp works like strcmp, except that if the last character
|
|
||||||
* in a failing match is a '*', the match is considered to have
|
|
||||||
* passed. The "*" match is suppressed whenever the port is "SU",
|
|
||||||
* which is the token the "su" command uses to validate access.
|
|
||||||
* A match returns 0, failure returns non-zero.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int portcmp (const char *pattern, const char *port)
|
|
||||||
{
|
|
||||||
const char *orig = port;
|
|
||||||
|
|
||||||
while (('\0' != *pattern) && (*pattern == *port)) {
|
|
||||||
pattern++;
|
|
||||||
port++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (('\0' == *pattern) && ('\0' == *port)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (('S' == orig[0]) && ('U' == orig[1]) && ('\0' == orig[2])) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (*pattern == '*') ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* setportent - open /etc/porttime file or rewind
|
|
||||||
*
|
|
||||||
* the /etc/porttime file is rewound if already open, or
|
|
||||||
* opened for reading.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void setportent (void)
|
|
||||||
{
|
|
||||||
if (NULL != ports) {
|
|
||||||
rewind (ports);
|
|
||||||
} else {
|
|
||||||
ports = fopen (PORTS, "r");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* endportent - close the /etc/porttime file
|
|
||||||
*
|
|
||||||
* the /etc/porttime file is closed and the ports variable set
|
|
||||||
* to NULL to indicate that the /etc/porttime file is no longer
|
|
||||||
* open.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void endportent (void)
|
|
||||||
{
|
|
||||||
if (NULL != ports) {
|
|
||||||
(void) fclose (ports);
|
|
||||||
}
|
|
||||||
|
|
||||||
ports = (FILE *) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getportent - read a single entry from /etc/porttime
|
|
||||||
*
|
|
||||||
* the next line in /etc/porttime is converted to a (struct port)
|
|
||||||
* and a pointer to a static (struct port) is returned to the
|
|
||||||
* invoker. NULL is returned on either EOF or error. errno is
|
|
||||||
* set to EINVAL on error to distinguish the two conditions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static struct port *getportent (void)
|
|
||||||
{
|
|
||||||
static struct port port; /* static struct to point to */
|
|
||||||
static char buf[BUFSIZ]; /* some space for stuff */
|
|
||||||
static char *ttys[PORT_TTY + 1]; /* some pointers to tty names */
|
|
||||||
static char *users[PORT_IDS + 1]; /* some pointers to user ids */
|
|
||||||
static struct pt_time ptimes[PORT_TIMES + 1]; /* time ranges */
|
|
||||||
char *cp; /* pointer into line */
|
|
||||||
int dtime; /* scratch time of day */
|
|
||||||
int i, j;
|
|
||||||
int saveerr = errno; /* errno value on entry */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the ports file is not open, open the file. Do not rewind
|
|
||||||
* since we want to search from the beginning each time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (NULL == ports) {
|
|
||||||
setportent ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NULL == ports) {
|
|
||||||
errno = saveerr;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Common point for beginning a new line -
|
|
||||||
*
|
|
||||||
* - read a line, and NUL terminate
|
|
||||||
* - skip lines which begin with '#'
|
|
||||||
* - parse off the tty names
|
|
||||||
* - parse off a list of user names
|
|
||||||
* - parse off a list of days and times
|
|
||||||
*/
|
|
||||||
|
|
||||||
again:
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the next line and remove the last character, which
|
|
||||||
* is a '\n'. Lines which begin with '#' are all ignored.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (fgets (buf, (int) sizeof buf, ports) == 0) {
|
|
||||||
errno = saveerr;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ('#' == buf[0]) {
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the name of the TTY device. It is the first colon
|
|
||||||
* separated field, and is the name of the TTY with no
|
|
||||||
* leading "/dev". The entry '*' is used to specify all
|
|
||||||
* TTY devices.
|
|
||||||
*/
|
|
||||||
|
|
||||||
buf[strlen (buf) - 1] = 0;
|
|
||||||
|
|
||||||
port.pt_names = ttys;
|
|
||||||
for (cp = buf, j = 0; j < PORT_TTY; j++) {
|
|
||||||
port.pt_names[j] = cp;
|
|
||||||
while (('\0' != *cp) && (':' != *cp) && (',' != *cp)) {
|
|
||||||
cp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('\0' == *cp) {
|
|
||||||
goto again; /* line format error */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (':' == *cp) { /* end of tty name list */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (',' == *cp) { /* end of current tty name */
|
|
||||||
*cp++ = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*cp = '\0';
|
|
||||||
cp++;
|
|
||||||
port.pt_names[j + 1] = (char *) 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the list of user names. It is the second colon
|
|
||||||
* separated field, and is a comma separated list of user
|
|
||||||
* names. The entry '*' is used to specify all usernames.
|
|
||||||
* The last entry in the list is a (char *) 0 pointer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (':' != *cp) {
|
|
||||||
port.pt_users = users;
|
|
||||||
port.pt_users[0] = cp;
|
|
||||||
|
|
||||||
for (j = 1; ':' != *cp; cp++) {
|
|
||||||
if ((',' == *cp) && (j < PORT_IDS)) {
|
|
||||||
*cp = '\0';
|
|
||||||
cp++;
|
|
||||||
port.pt_users[j] = cp;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
port.pt_users[j] = 0;
|
|
||||||
} else {
|
|
||||||
port.pt_users = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (':' != *cp) {
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
|
|
||||||
*cp = '\0';
|
|
||||||
cp++;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the list of valid times. The times field is the third
|
|
||||||
* colon separated field and is a list of days of the week and
|
|
||||||
* times during which this port may be used by this user. The
|
|
||||||
* valid days are 'Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', and 'Sa'.
|
|
||||||
*
|
|
||||||
* In addition, the value 'Al' represents all 7 days, and 'Wk'
|
|
||||||
* represents the 5 weekdays.
|
|
||||||
*
|
|
||||||
* Times are given as HHMM-HHMM. The ending time may be before
|
|
||||||
* the starting time. Days are presumed to wrap at 0000.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ('\0' == *cp) {
|
|
||||||
port.pt_times = 0;
|
|
||||||
return &port;
|
|
||||||
}
|
|
||||||
|
|
||||||
port.pt_times = ptimes;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the next comma separated entry
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (j = 0; ('\0' != *cp) && (j < PORT_TIMES); j++) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Start off with no days of the week
|
|
||||||
*/
|
|
||||||
|
|
||||||
port.pt_times[j].t_days = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check each two letter sequence to see if it is
|
|
||||||
* one of the abbreviations for the days of the
|
|
||||||
* week or the other two values.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i = 0;
|
|
||||||
('\0' != cp[i]) && ('\0' != cp[i + 1]) && isalpha (cp[i]);
|
|
||||||
i += 2) {
|
|
||||||
switch ((cp[i] << 8) | (cp[i + 1])) {
|
|
||||||
case ('S' << 8) | 'u':
|
|
||||||
port.pt_times[j].t_days |= 01;
|
|
||||||
break;
|
|
||||||
case ('M' << 8) | 'o':
|
|
||||||
port.pt_times[j].t_days |= 02;
|
|
||||||
break;
|
|
||||||
case ('T' << 8) | 'u':
|
|
||||||
port.pt_times[j].t_days |= 04;
|
|
||||||
break;
|
|
||||||
case ('W' << 8) | 'e':
|
|
||||||
port.pt_times[j].t_days |= 010;
|
|
||||||
break;
|
|
||||||
case ('T' << 8) | 'h':
|
|
||||||
port.pt_times[j].t_days |= 020;
|
|
||||||
break;
|
|
||||||
case ('F' << 8) | 'r':
|
|
||||||
port.pt_times[j].t_days |= 040;
|
|
||||||
break;
|
|
||||||
case ('S' << 8) | 'a':
|
|
||||||
port.pt_times[j].t_days |= 0100;
|
|
||||||
break;
|
|
||||||
case ('W' << 8) | 'k':
|
|
||||||
port.pt_times[j].t_days |= 076;
|
|
||||||
break;
|
|
||||||
case ('A' << 8) | 'l':
|
|
||||||
port.pt_times[j].t_days |= 0177;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = EINVAL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The default is 'Al' if no days were seen.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (0 == i) {
|
|
||||||
port.pt_times[j].t_days = 0177;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The start and end times are separated from each
|
|
||||||
* other by a '-'. The times are four digit numbers
|
|
||||||
* representing the times of day.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (dtime = 0; ('\0' != cp[i]) && isdigit (cp[i]); i++) {
|
|
||||||
dtime = dtime * 10 + cp[i] - '0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (('-' != cp[i]) || (dtime > 2400) || ((dtime % 100) > 59)) {
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
port.pt_times[j].t_start = dtime;
|
|
||||||
cp = cp + i + 1;
|
|
||||||
|
|
||||||
for (dtime = 0, i = 0;
|
|
||||||
('\0' != cp[i]) && isdigit (cp[i]);
|
|
||||||
i++) {
|
|
||||||
dtime = dtime * 10 + cp[i] - '0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ((',' != cp[i]) && ('\0' != cp[i]))
|
|
||||||
|| (dtime > 2400)
|
|
||||||
|| ((dtime % 100) > 59)) {
|
|
||||||
goto again;
|
|
||||||
}
|
|
||||||
|
|
||||||
port.pt_times[j].t_end = dtime;
|
|
||||||
cp = cp + i + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The end of the list is indicated by a pair of -1's for the
|
|
||||||
* start and end times.
|
|
||||||
*/
|
|
||||||
|
|
||||||
port.pt_times[j].t_start = port.pt_times[j].t_end = -1;
|
|
||||||
|
|
||||||
return &port;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getttyuser - get ports information for user and tty
|
|
||||||
*
|
|
||||||
* getttyuser() searches the ports file for an entry with a TTY
|
|
||||||
* and user field both of which match the supplied TTY and
|
|
||||||
* user name. The file is searched from the beginning, so the
|
|
||||||
* entries are treated as an ordered list.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static struct port *getttyuser (const char *tty, const char *user)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
struct port *port;
|
|
||||||
|
|
||||||
setportent ();
|
|
||||||
|
|
||||||
while ((port = getportent ()) != NULL) {
|
|
||||||
if ( (0 == port->pt_names)
|
|
||||||
|| (0 == port->pt_users)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; NULL != port->pt_names[i]; i++) {
|
|
||||||
if (portcmp (port->pt_names[i], tty) == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (port->pt_names[i] == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; NULL != port->pt_users[j]; j++) {
|
|
||||||
if ( (strcmp (user, port->pt_users[j]) == 0)
|
|
||||||
|| (strcmp (port->pt_users[j], "*") == 0)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (port->pt_users[j] != 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endportent ();
|
|
||||||
return port;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* isttytime - tell if a given user may login at a particular time
|
|
||||||
*
|
|
||||||
* isttytime searches the ports file for an entry which matches
|
|
||||||
* the user name and TTY given.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool isttytime (const char *id, const char *port, time_t when)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int dtime;
|
|
||||||
struct port *pp;
|
|
||||||
struct tm *tm;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Try to find a matching entry for this user. Default to
|
|
||||||
* letting the user in - there are plenty of ways to have an
|
|
||||||
* entry to match all users.
|
|
||||||
*/
|
|
||||||
|
|
||||||
pp = getttyuser (port, id);
|
|
||||||
if (NULL == pp) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The entry is there, but has no time entries - don't
|
|
||||||
* ever let them login.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (0 == pp->pt_times) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The current time is converted to HHMM format for
|
|
||||||
* comparison against the time values in the TTY entry.
|
|
||||||
*/
|
|
||||||
|
|
||||||
tm = localtime (&when);
|
|
||||||
dtime = tm->tm_hour * 100 + tm->tm_min;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Each time entry is compared against the current
|
|
||||||
* time. For entries with the start after the end time,
|
|
||||||
* the comparison is made so that the time is between
|
|
||||||
* midnight and either the start or end time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i = 0; pp->pt_times[i].t_start != -1; i++) {
|
|
||||||
if (!(pp->pt_times[i].t_days & PORT_DAY (tm->tm_wday))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pp->pt_times[i].t_start <= pp->pt_times[i].t_end) {
|
|
||||||
if ( (dtime >= pp->pt_times[i].t_start)
|
|
||||||
&& (dtime <= pp->pt_times[i].t_end)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( (dtime >= pp->pt_times[i].t_start)
|
|
||||||
|| (dtime <= pp->pt_times[i].t_end)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No matching time entry was found, user shouldn't
|
|
||||||
* be let in right now.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
-83
@@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1989 - 1991, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1997, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* port.h - structure of /etc/porttime
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Each entry in /etc/porttime consists of a TTY device
|
|
||||||
* name or "*" to indicate all TTY devices, followed by
|
|
||||||
* a list of 1 or more user IDs or "*" to indicate all
|
|
||||||
* user names, followed by a list of zero or more valid
|
|
||||||
* login times. Login time entries consist of zero or
|
|
||||||
* more day names (Su, Mo, Tu, We, Th, Fr, Sa, Wk, Al)
|
|
||||||
* followed by a pair of time values in HHMM format
|
|
||||||
* separated by a "-".
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PORTS - Name of system port access time file.
|
|
||||||
* PORT_IDS - Allowable number of IDs per entry.
|
|
||||||
* PORT_TTY - Allowable number of TTYs per entry.
|
|
||||||
* PORT_TIMES - Allowable number of time entries per entry.
|
|
||||||
* PORT_DAY - Day of the week to a bit value (0 = Sunday).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PORTS "/etc/porttime"
|
|
||||||
#define PORT_IDS 64
|
|
||||||
#define PORT_TTY 64
|
|
||||||
#define PORT_TIMES 24
|
|
||||||
#define PORT_DAY(day) (1<<(day))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* pt_names - pointer to array of device names in /dev/
|
|
||||||
* pt_users - pointer to array of applicable user IDs.
|
|
||||||
* pt_times - pointer to list of allowable time periods.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct port {
|
|
||||||
char **pt_names;
|
|
||||||
char **pt_users;
|
|
||||||
struct pt_time *pt_times;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* t_days - bit array for each day of the week (0 = Sunday)
|
|
||||||
* t_start - starting time for this entry
|
|
||||||
* t_end - ending time for this entry
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct pt_time {
|
|
||||||
short t_days;
|
|
||||||
short t_start;
|
|
||||||
short t_end;
|
|
||||||
};
|
|
||||||
@@ -1,466 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2003 - 2006, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 - 2010, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* prototypes.h
|
|
||||||
*
|
|
||||||
* prototypes of libmisc functions, and private lib functions.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _PROTOTYPES_H
|
|
||||||
#define _PROTOTYPES_H
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#ifdef USE_UTMPX
|
|
||||||
#include <utmpx.h>
|
|
||||||
#else
|
|
||||||
#include <utmp.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <grp.h>
|
|
||||||
#include <shadow.h>
|
|
||||||
#include <lastlog.h>
|
|
||||||
|
|
||||||
#include "defines.h"
|
|
||||||
#include "commonio.h"
|
|
||||||
|
|
||||||
extern /*@observer@*/ const char *Prog;
|
|
||||||
|
|
||||||
/* addgrps.c */
|
|
||||||
#if defined (HAVE_SETGROUPS) && ! defined (USE_PAM)
|
|
||||||
extern int add_groups (const char *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* age.c */
|
|
||||||
extern void agecheck (/*@null@*/const struct spwd *);
|
|
||||||
extern int expire (const struct passwd *, /*@null@*/const struct spwd *);
|
|
||||||
/* isexpired.c */
|
|
||||||
extern int isexpired (const struct passwd *, /*@null@*/const struct spwd *);
|
|
||||||
|
|
||||||
/* btrfs.c */
|
|
||||||
#ifdef WITH_BTRFS
|
|
||||||
extern int btrfs_create_subvolume(const char *path);
|
|
||||||
extern int btrfs_remove_subvolume(const char *path);
|
|
||||||
extern int btrfs_is_subvolume(const char *path);
|
|
||||||
extern int is_btrfs(const char *path);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* basename() renamed to Basename() to avoid libc name space confusion */
|
|
||||||
/* basename.c */
|
|
||||||
extern /*@observer@*/const char *Basename (const char *str);
|
|
||||||
|
|
||||||
/* chowndir.c */
|
|
||||||
extern int chown_tree (const char *root,
|
|
||||||
uid_t old_uid, uid_t new_uid,
|
|
||||||
gid_t old_gid, gid_t new_gid);
|
|
||||||
|
|
||||||
/* chowntty.c */
|
|
||||||
extern void chown_tty (const struct passwd *);
|
|
||||||
|
|
||||||
/* cleanup.c */
|
|
||||||
typedef /*@null@*/void (*cleanup_function) (/*@null@*/void *arg);
|
|
||||||
void add_cleanup (/*@notnull@*/cleanup_function pcf, /*@null@*/void *arg);
|
|
||||||
void del_cleanup (/*@notnull@*/cleanup_function pcf);
|
|
||||||
void do_cleanups (void);
|
|
||||||
|
|
||||||
/* cleanup_group.c */
|
|
||||||
struct cleanup_info_mod {
|
|
||||||
char *audit_msg;
|
|
||||||
char *action;
|
|
||||||
/*@observer@*/const char *name;
|
|
||||||
};
|
|
||||||
void cleanup_report_add_group (void *group_name);
|
|
||||||
void cleanup_report_add_group_group (void *group_name);
|
|
||||||
#ifdef SHADOWGRP
|
|
||||||
void cleanup_report_add_group_gshadow (void *group_name);
|
|
||||||
#endif
|
|
||||||
void cleanup_report_del_group (void *group_name);
|
|
||||||
void cleanup_report_del_group_group (void *group_name);
|
|
||||||
#ifdef SHADOWGRP
|
|
||||||
void cleanup_report_del_group_gshadow (void *group_name);
|
|
||||||
#endif
|
|
||||||
void cleanup_report_mod_passwd (void *cleanup_info);
|
|
||||||
void cleanup_report_mod_group (void *cleanup_info);
|
|
||||||
void cleanup_report_mod_gshadow (void *cleanup_info);
|
|
||||||
void cleanup_unlock_group (/*@null@*/void *unused);
|
|
||||||
#ifdef SHADOWGRP
|
|
||||||
void cleanup_unlock_gshadow (/*@null@*/void *unused);
|
|
||||||
#endif
|
|
||||||
void cleanup_unlock_passwd (/*@null@*/void *unused);
|
|
||||||
|
|
||||||
/* console.c */
|
|
||||||
extern bool console (const char *);
|
|
||||||
|
|
||||||
/* copydir.c */
|
|
||||||
extern int copy_tree (const char *src_root, const char *dst_root,
|
|
||||||
bool copy_root,
|
|
||||||
bool reset_selinux,
|
|
||||||
uid_t old_uid, uid_t new_uid,
|
|
||||||
gid_t old_gid, gid_t new_gid);
|
|
||||||
|
|
||||||
/* encrypt.c */
|
|
||||||
extern /*@exposed@*//*@null@*/char *pw_encrypt (const char *, const char *);
|
|
||||||
|
|
||||||
/* entry.c */
|
|
||||||
extern void pw_entry (const char *, struct passwd *);
|
|
||||||
|
|
||||||
/* env.c */
|
|
||||||
extern void addenv (const char *, /*@null@*/const char *);
|
|
||||||
extern void initenv (void);
|
|
||||||
extern void set_env (int, char *const *);
|
|
||||||
extern void sanitize_env (void);
|
|
||||||
|
|
||||||
/* fields.c */
|
|
||||||
extern void change_field (char *, size_t, const char *);
|
|
||||||
extern int valid_field (const char *, const char *);
|
|
||||||
|
|
||||||
/* find_new_gid.c */
|
|
||||||
extern int find_new_gid (bool sys_group,
|
|
||||||
gid_t *gid,
|
|
||||||
/*@null@*/gid_t const *preferred_gid);
|
|
||||||
|
|
||||||
/* find_new_uid.c */
|
|
||||||
extern int find_new_uid (bool sys_user,
|
|
||||||
uid_t *uid,
|
|
||||||
/*@null@*/uid_t const *preferred_uid);
|
|
||||||
|
|
||||||
#ifdef ENABLE_SUBIDS
|
|
||||||
/* find_new_sub_gids.c */
|
|
||||||
extern int find_new_sub_gids (const char *owner,
|
|
||||||
gid_t *range_start, unsigned long *range_count);
|
|
||||||
|
|
||||||
/* find_new_sub_uids.c */
|
|
||||||
extern int find_new_sub_uids (const char *owner,
|
|
||||||
uid_t *range_start, unsigned long *range_count);
|
|
||||||
#endif /* ENABLE_SUBIDS */
|
|
||||||
|
|
||||||
|
|
||||||
/* get_gid.c */
|
|
||||||
extern int get_gid (const char *gidstr, gid_t *gid);
|
|
||||||
|
|
||||||
/* getgr_nam_gid.c */
|
|
||||||
extern /*@only@*//*@null@*/struct group *getgr_nam_gid (/*@null@*/const char *grname);
|
|
||||||
|
|
||||||
/* getlong.c */
|
|
||||||
extern int getlong (const char *numstr, /*@out@*/long int *result);
|
|
||||||
|
|
||||||
/* get_pid.c */
|
|
||||||
extern int get_pid (const char *pidstr, pid_t *pid);
|
|
||||||
|
|
||||||
/* getrange */
|
|
||||||
extern int getrange (char *range,
|
|
||||||
unsigned long *min, bool *has_min,
|
|
||||||
unsigned long *max, bool *has_max);
|
|
||||||
|
|
||||||
/* gettime.c */
|
|
||||||
extern time_t gettime ();
|
|
||||||
|
|
||||||
/* get_uid.c */
|
|
||||||
extern int get_uid (const char *uidstr, uid_t *uid);
|
|
||||||
|
|
||||||
/* getulong.c */
|
|
||||||
extern int getulong (const char *numstr, /*@out@*/unsigned long int *result);
|
|
||||||
|
|
||||||
/* fputsx.c */
|
|
||||||
extern /*@null@*/char *fgetsx (/*@returned@*/ /*@out@*/char *, int, FILE *);
|
|
||||||
extern int fputsx (const char *, FILE *);
|
|
||||||
|
|
||||||
/* groupio.c */
|
|
||||||
extern void __gr_del_entry (const struct commonio_entry *ent);
|
|
||||||
extern /*@observer@*/const struct commonio_db *__gr_get_db (void);
|
|
||||||
extern /*@dependent@*/ /*@null@*/struct commonio_entry *__gr_get_head (void);
|
|
||||||
extern void __gr_set_changed (void);
|
|
||||||
|
|
||||||
/* groupmem.c */
|
|
||||||
extern /*@null@*/ /*@only@*/struct group *__gr_dup (const struct group *grent);
|
|
||||||
extern void gr_free (/*@out@*/ /*@only@*/struct group *grent);
|
|
||||||
|
|
||||||
/* hushed.c */
|
|
||||||
extern bool hushed (const char *username);
|
|
||||||
|
|
||||||
/* audit_help.c */
|
|
||||||
#ifdef WITH_AUDIT
|
|
||||||
extern int audit_fd;
|
|
||||||
extern void audit_help_open (void);
|
|
||||||
/* Use AUDIT_NO_ID when a name is provided to audit_logger instead of an ID */
|
|
||||||
#define AUDIT_NO_ID ((unsigned int) -1)
|
|
||||||
typedef enum {
|
|
||||||
SHADOW_AUDIT_FAILURE = 0,
|
|
||||||
SHADOW_AUDIT_SUCCESS = 1} shadow_audit_result;
|
|
||||||
extern void audit_logger (int type, const char *pgname, const char *op,
|
|
||||||
const char *name, unsigned int id,
|
|
||||||
shadow_audit_result result);
|
|
||||||
void audit_logger_message (const char *message, shadow_audit_result result);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* limits.c */
|
|
||||||
#ifndef USE_PAM
|
|
||||||
extern void setup_limits (const struct passwd *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* list.c */
|
|
||||||
extern /*@only@*/ /*@out@*/char **add_list (/*@returned@*/ /*@only@*/char **, const char *);
|
|
||||||
extern /*@only@*/ /*@out@*/char **del_list (/*@returned@*/ /*@only@*/char **, const char *);
|
|
||||||
extern /*@only@*/ /*@out@*/char **dup_list (char *const *);
|
|
||||||
extern bool is_on_list (char *const *list, const char *member);
|
|
||||||
extern /*@only@*/char **comma_to_list (const char *);
|
|
||||||
|
|
||||||
/* log.c */
|
|
||||||
extern void dolastlog (
|
|
||||||
struct lastlog *ll,
|
|
||||||
const struct passwd *pw,
|
|
||||||
/*@unique@*/const char *line,
|
|
||||||
/*@unique@*/const char *host);
|
|
||||||
|
|
||||||
/* login_nopam.c */
|
|
||||||
extern int login_access (const char *user, const char *from);
|
|
||||||
|
|
||||||
/* loginprompt.c */
|
|
||||||
extern void login_prompt (const char *, char *, int);
|
|
||||||
|
|
||||||
/* mail.c */
|
|
||||||
extern void mailcheck (void);
|
|
||||||
|
|
||||||
/* motd.c */
|
|
||||||
extern void motd (void);
|
|
||||||
|
|
||||||
/* myname.c */
|
|
||||||
extern /*@null@*//*@only@*/struct passwd *get_my_pwent (void);
|
|
||||||
|
|
||||||
/* pam_pass_non_interactive.c */
|
|
||||||
#ifdef USE_PAM
|
|
||||||
extern int do_pam_passwd_non_interactive (const char *pam_service,
|
|
||||||
const char *username,
|
|
||||||
const char* password);
|
|
||||||
#endif /* USE_PAM */
|
|
||||||
|
|
||||||
/* obscure.c */
|
|
||||||
#ifndef USE_PAM
|
|
||||||
extern bool obscure (const char *, const char *, const struct passwd *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* pam_pass.c */
|
|
||||||
#ifdef USE_PAM
|
|
||||||
extern void do_pam_passwd (const char *user, bool silent, bool change_expired);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* port.c */
|
|
||||||
extern bool isttytime (const char *, const char *, time_t);
|
|
||||||
|
|
||||||
/* prefix_flag.c */
|
|
||||||
extern const char* process_prefix_flag (const char* short_opt, int argc, char **argv);
|
|
||||||
extern struct group *prefix_getgrnam(const char *name);
|
|
||||||
extern struct group *prefix_getgrgid(gid_t gid);
|
|
||||||
extern struct passwd *prefix_getpwuid(uid_t uid);
|
|
||||||
extern struct passwd *prefix_getpwnam(const char* name);
|
|
||||||
extern struct spwd *prefix_getspnam(const char* name);
|
|
||||||
extern struct group *prefix_getgr_nam_gid(const char *grname);
|
|
||||||
extern void prefix_setpwent();
|
|
||||||
extern struct passwd* prefix_getpwent();
|
|
||||||
extern void prefix_endpwent();
|
|
||||||
extern void prefix_setgrent();
|
|
||||||
extern struct group* prefix_getgrent();
|
|
||||||
extern void prefix_endgrent();
|
|
||||||
|
|
||||||
/* pwd2spwd.c */
|
|
||||||
#ifndef USE_PAM
|
|
||||||
extern struct spwd *pwd_to_spwd (const struct passwd *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* pwdcheck.c */
|
|
||||||
#ifndef USE_PAM
|
|
||||||
extern void passwd_check (const char *, const char *, const char *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* pwd_init.c */
|
|
||||||
extern void pwd_init (void);
|
|
||||||
|
|
||||||
/* pwio.c */
|
|
||||||
extern void __pw_del_entry (const struct commonio_entry *ent);
|
|
||||||
extern struct commonio_db *__pw_get_db (void);
|
|
||||||
extern /*@dependent@*/ /*@null@*/struct commonio_entry *__pw_get_head (void);
|
|
||||||
|
|
||||||
/* pwmem.c */
|
|
||||||
extern /*@null@*/ /*@only@*/struct passwd *__pw_dup (const struct passwd *pwent);
|
|
||||||
extern void pw_free (/*@out@*/ /*@only@*/struct passwd *pwent);
|
|
||||||
|
|
||||||
/* remove_tree.c */
|
|
||||||
extern int remove_tree (const char *root, bool remove_root);
|
|
||||||
|
|
||||||
/* rlogin.c */
|
|
||||||
extern int do_rlogin (const char *remote_host, char *name, size_t namelen,
|
|
||||||
char *term, size_t termlen);
|
|
||||||
|
|
||||||
/* root_flag.c */
|
|
||||||
extern void process_root_flag (const char* short_opt, int argc, char **argv);
|
|
||||||
|
|
||||||
/* salt.c */
|
|
||||||
extern /*@observer@*/const char *crypt_make_salt (/*@null@*//*@observer@*/const char *meth, /*@null@*/void *arg);
|
|
||||||
|
|
||||||
/* selinux.c */
|
|
||||||
#ifdef WITH_SELINUX
|
|
||||||
extern int set_selinux_file_context (const char *dst_name);
|
|
||||||
extern int reset_selinux_file_context (void);
|
|
||||||
extern int check_selinux_permit (const char *perm_name);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* semanage.c */
|
|
||||||
#ifdef WITH_SELINUX
|
|
||||||
extern int set_seuser(const char *login_name, const char *seuser_name);
|
|
||||||
extern int del_seuser(const char *login_name);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* setugid.c */
|
|
||||||
extern int setup_groups (const struct passwd *info);
|
|
||||||
extern int change_uid (const struct passwd *info);
|
|
||||||
#if (defined HAVE_INITGROUPS) && (! defined USE_PAM)
|
|
||||||
extern int setup_uid_gid (const struct passwd *info, bool is_console);
|
|
||||||
#else
|
|
||||||
extern int setup_uid_gid (const struct passwd *info);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* setup.c */
|
|
||||||
extern void setup (struct passwd *);
|
|
||||||
|
|
||||||
/* setupenv.c */
|
|
||||||
extern void setup_env (struct passwd *);
|
|
||||||
|
|
||||||
/* sgetgrent.c */
|
|
||||||
extern struct group *sgetgrent (const char *buf);
|
|
||||||
|
|
||||||
/* sgetpwent.c */
|
|
||||||
extern struct passwd *sgetpwent (const char *buf);
|
|
||||||
|
|
||||||
/* sgetspent.c */
|
|
||||||
#ifndef HAVE_SGETSPENT
|
|
||||||
extern struct spwd *sgetspent (const char *string);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* sgroupio.c */
|
|
||||||
extern void __sgr_del_entry (const struct commonio_entry *ent);
|
|
||||||
extern /*@null@*/ /*@only@*/struct sgrp *__sgr_dup (const struct sgrp *sgent);
|
|
||||||
extern void sgr_free (/*@out@*/ /*@only@*/struct sgrp *sgent);
|
|
||||||
extern /*@dependent@*/ /*@null@*/struct commonio_entry *__sgr_get_head (void);
|
|
||||||
extern void __sgr_set_changed (void);
|
|
||||||
|
|
||||||
/* shadowio.c */
|
|
||||||
extern /*@dependent@*/ /*@null@*/struct commonio_entry *__spw_get_head (void);
|
|
||||||
extern void __spw_del_entry (const struct commonio_entry *ent);
|
|
||||||
|
|
||||||
/* shadowmem.c */
|
|
||||||
extern /*@null@*/ /*@only@*/struct spwd *__spw_dup (const struct spwd *spent);
|
|
||||||
extern void spw_free (/*@out@*/ /*@only@*/struct spwd *spent);
|
|
||||||
|
|
||||||
/* shell.c */
|
|
||||||
extern int shell (const char *file, /*@null@*/const char *arg, char *const envp[]);
|
|
||||||
|
|
||||||
/* spawn.c */
|
|
||||||
extern int run_command (const char *cmd, const char *argv[],
|
|
||||||
/*@null@*/const char *envp[], /*@out@*/int *status);
|
|
||||||
|
|
||||||
/* strtoday.c */
|
|
||||||
extern long strtoday (const char *);
|
|
||||||
|
|
||||||
/* suauth.c */
|
|
||||||
extern int check_su_auth (const char *actual_id,
|
|
||||||
const char *wanted_id,
|
|
||||||
bool su_to_root);
|
|
||||||
|
|
||||||
/* sulog.c */
|
|
||||||
extern void sulog (const char *tty,
|
|
||||||
bool success,
|
|
||||||
const char *oldname,
|
|
||||||
const char *name);
|
|
||||||
|
|
||||||
/* sub.c */
|
|
||||||
extern void subsystem (const struct passwd *);
|
|
||||||
|
|
||||||
/* ttytype.c */
|
|
||||||
extern void ttytype (const char *);
|
|
||||||
|
|
||||||
/* tz.c */
|
|
||||||
#ifndef USE_PAM
|
|
||||||
extern /*@observer@*/const char *tz (const char *);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ulimit.c */
|
|
||||||
extern int set_filesize_limit (int blocks);
|
|
||||||
|
|
||||||
/* user_busy.c */
|
|
||||||
extern int user_busy (const char *name, uid_t uid);
|
|
||||||
|
|
||||||
/* utmp.c */
|
|
||||||
#ifndef USE_UTMPX
|
|
||||||
extern /*@null@*/struct utmp *get_current_utmp (void);
|
|
||||||
extern struct utmp *prepare_utmp (const char *name,
|
|
||||||
const char *line,
|
|
||||||
const char *host,
|
|
||||||
/*@null@*/const struct utmp *ut);
|
|
||||||
extern int setutmp (struct utmp *ut);
|
|
||||||
#else
|
|
||||||
extern /*@null@*/struct utmpx *get_current_utmp (void);
|
|
||||||
extern struct utmpx *prepare_utmpx (const char *name,
|
|
||||||
const char *line,
|
|
||||||
const char *host,
|
|
||||||
/*@null@*/const struct utmpx *ut);
|
|
||||||
extern int setutmpx (struct utmpx *utx);
|
|
||||||
#endif /* USE_UTMPX */
|
|
||||||
|
|
||||||
/* valid.c */
|
|
||||||
extern bool valid (const char *, const struct passwd *);
|
|
||||||
|
|
||||||
/* xmalloc.c */
|
|
||||||
extern /*@maynotreturn@*/ /*@only@*//*@out@*//*@notnull@*/char *xmalloc (size_t size)
|
|
||||||
/*@ensures MaxSet(result) == (size - 1); @*/;
|
|
||||||
extern /*@maynotreturn@*/ /*@only@*//*@notnull@*/char *xstrdup (const char *);
|
|
||||||
|
|
||||||
/* xgetpwnam.c */
|
|
||||||
extern /*@null@*/ /*@only@*/struct passwd *xgetpwnam (const char *);
|
|
||||||
/* xgetpwuid.c */
|
|
||||||
extern /*@null@*/ /*@only@*/struct passwd *xgetpwuid (uid_t);
|
|
||||||
/* xgetgrnam.c */
|
|
||||||
extern /*@null@*/ /*@only@*/struct group *xgetgrnam (const char *);
|
|
||||||
/* xgetgrgid.c */
|
|
||||||
extern /*@null@*/ /*@only@*/struct group *xgetgrgid (gid_t);
|
|
||||||
/* xgetspnam.c */
|
|
||||||
extern /*@null@*/ /*@only@*/struct spwd *xgetspnam(const char *);
|
|
||||||
|
|
||||||
/* yesno.c */
|
|
||||||
extern bool yes_or_no (bool read_only);
|
|
||||||
|
|
||||||
#endif /* _PROTOTYPES_H */
|
|
||||||
-234
@@ -1,234 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1992 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2003 - 2006, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2008 - 2009, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ifndef USE_PAM
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "pwauth.h"
|
|
||||||
#include "getdef.h"
|
|
||||||
#ifdef SKEY
|
|
||||||
#include <skey.h>
|
|
||||||
#endif
|
|
||||||
#ifdef __linux__ /* standard password prompt by default */
|
|
||||||
static const char *PROMPT = gettext_noop ("Password: ");
|
|
||||||
#else
|
|
||||||
static const char *PROMPT = gettext_noop ("%s's Password: ");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool wipe_clear_pass = true;
|
|
||||||
/*@null@*/char *clear_pass = NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* pw_auth - perform getpass/crypt authentication
|
|
||||||
*
|
|
||||||
* pw_auth gets the user's cleartext password and encrypts it
|
|
||||||
* using the salt in the encrypted password. The results are
|
|
||||||
* compared.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int pw_auth (const char *cipher,
|
|
||||||
const char *user,
|
|
||||||
int reason,
|
|
||||||
/*@null@*/const char *input)
|
|
||||||
{
|
|
||||||
char prompt[1024];
|
|
||||||
char *clear = NULL;
|
|
||||||
const char *cp;
|
|
||||||
const char *encrypted;
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
#ifdef SKEY
|
|
||||||
bool use_skey = false;
|
|
||||||
char challenge_info[40];
|
|
||||||
struct skey skey;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* There are programs for adding and deleting authentication data.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((PW_ADD == reason) || (PW_DELETE == reason)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* There are even programs for changing the user name ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((PW_CHANGE == reason) && (NULL != input)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* WARNING:
|
|
||||||
*
|
|
||||||
* When we change a password and we are root, we don't prompt.
|
|
||||||
* This is so root can change any password without having to
|
|
||||||
* know it. This is a policy decision that might have to be
|
|
||||||
* revisited.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((PW_CHANGE == reason) && (getuid () == 0)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* WARNING:
|
|
||||||
*
|
|
||||||
* When we are logging in a user with no ciphertext password,
|
|
||||||
* we don't prompt for the password or anything. In reality
|
|
||||||
* the user could just hit <ENTER>, so it doesn't really
|
|
||||||
* matter.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((NULL == cipher) || ('\0' == *cipher)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SKEY
|
|
||||||
/*
|
|
||||||
* If the user has an S/KEY entry show them the pertinent info
|
|
||||||
* and then we can try validating the created cyphertext and the SKEY.
|
|
||||||
* If there is no SKEY information we default to not using SKEY.
|
|
||||||
*/
|
|
||||||
|
|
||||||
# ifdef SKEY_BSD_STYLE
|
|
||||||
/*
|
|
||||||
* Some BSD updates to the S/KEY API adds a fourth parameter; the
|
|
||||||
* sizeof of the challenge info buffer.
|
|
||||||
*/
|
|
||||||
# define skeychallenge(s,u,c) skeychallenge(s,u,c,sizeof(c))
|
|
||||||
# endif
|
|
||||||
|
|
||||||
if (skeychallenge (&skey, user, challenge_info) == 0) {
|
|
||||||
use_skey = true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prompt for the password as required. FTPD and REXECD both
|
|
||||||
* get the cleartext password for us.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((PW_FTP != reason) && (PW_REXEC != reason) && (NULL == input)) {
|
|
||||||
cp = getdef_str ("LOGIN_STRING");
|
|
||||||
if (NULL == cp) {
|
|
||||||
cp = _(PROMPT);
|
|
||||||
}
|
|
||||||
#ifdef SKEY
|
|
||||||
if (use_skey) {
|
|
||||||
printf ("[%s]\n", challenge_info);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
snprintf (prompt, sizeof prompt, cp, user);
|
|
||||||
clear = getpass (prompt);
|
|
||||||
if (NULL == clear) {
|
|
||||||
static char c[1];
|
|
||||||
|
|
||||||
c[0] = '\0';
|
|
||||||
clear = c;
|
|
||||||
}
|
|
||||||
input = clear;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert the cleartext password into a ciphertext string.
|
|
||||||
* If the two match, the return value will be zero, which is
|
|
||||||
* SUCCESS. Otherwise we see if SKEY is being used and check
|
|
||||||
* the results there as well.
|
|
||||||
*/
|
|
||||||
|
|
||||||
encrypted = pw_encrypt (input, cipher);
|
|
||||||
if (NULL != encrypted) {
|
|
||||||
retval = strcmp (encrypted, cipher);
|
|
||||||
} else {
|
|
||||||
retval = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SKEY
|
|
||||||
/*
|
|
||||||
* If (1) The password fails to match, and
|
|
||||||
* (2) The password is empty and
|
|
||||||
* (3) We are using OPIE or S/Key, then
|
|
||||||
* ...Re-prompt, with echo on.
|
|
||||||
* -- AR 8/22/1999
|
|
||||||
*/
|
|
||||||
if ((0 != retval) && ('\0' == input[0]) && use_skey) {
|
|
||||||
clear = getpass (prompt);
|
|
||||||
if (NULL == clear) {
|
|
||||||
static char c[1];
|
|
||||||
|
|
||||||
c[0] = '\0';
|
|
||||||
clear = c;
|
|
||||||
}
|
|
||||||
input = clear;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((0 != retval) && use_skey) {
|
|
||||||
int passcheck = -1;
|
|
||||||
|
|
||||||
if (skeyverify (&skey, input) == 0) {
|
|
||||||
passcheck = skey.n;
|
|
||||||
}
|
|
||||||
if (passcheck > 0) {
|
|
||||||
retval = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Things like RADIUS authentication may need the password -
|
|
||||||
* if the external variable wipe_clear_pass is zero, we will
|
|
||||||
* not wipe it (the caller should wipe clear_pass when it is
|
|
||||||
* no longer needed). --marekm
|
|
||||||
*/
|
|
||||||
|
|
||||||
clear_pass = clear;
|
|
||||||
if (wipe_clear_pass && (NULL != clear) && ('\0' != *clear)) {
|
|
||||||
strzero (clear);
|
|
||||||
}
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
#else /* !USE_PAM */
|
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
|
||||||
#endif /* !USE_PAM */
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1992 - 1993, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 1997, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2003 - 2005, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2009 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 USE_PAM
|
|
||||||
int pw_auth (const char *cipher,
|
|
||||||
const char *user,
|
|
||||||
int flag,
|
|
||||||
/*@null@*/const char *input);
|
|
||||||
#endif /* !USE_PAM */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Local access
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PW_SU 1
|
|
||||||
#define PW_LOGIN 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Administrative functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PW_ADD 101
|
|
||||||
#define PW_CHANGE 102
|
|
||||||
#define PW_DELETE 103
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Network access
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define PW_TELNET 201
|
|
||||||
#define PW_RLOGIN 202
|
|
||||||
#define PW_FTP 203
|
|
||||||
#define PW_REXEC 204
|
|
||||||
-227
@@ -1,227 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2001 , Michał Moskal
|
|
||||||
* Copyright (c) 2003 - 2005, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 - 2009, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "commonio.h"
|
|
||||||
#include "pwio.h"
|
|
||||||
|
|
||||||
static /*@null@*/ /*@only@*/void *passwd_dup (const void *ent)
|
|
||||||
{
|
|
||||||
const struct passwd *pw = ent;
|
|
||||||
|
|
||||||
return __pw_dup (pw);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void passwd_free (/*@out@*/ /*@only@*/void *ent)
|
|
||||||
{
|
|
||||||
struct passwd *pw = ent;
|
|
||||||
|
|
||||||
pw_free (pw);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *passwd_getname (const void *ent)
|
|
||||||
{
|
|
||||||
const struct passwd *pw = ent;
|
|
||||||
|
|
||||||
return pw->pw_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *passwd_parse (const char *line)
|
|
||||||
{
|
|
||||||
return (void *) sgetpwent (line);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int passwd_put (const void *ent, FILE * file)
|
|
||||||
{
|
|
||||||
const struct passwd *pw = ent;
|
|
||||||
|
|
||||||
if ( (NULL == pw)
|
|
||||||
|| (valid_field (pw->pw_name, ":\n") == -1)
|
|
||||||
|| (valid_field (pw->pw_passwd, ":\n") == -1)
|
|
||||||
|| (pw->pw_uid == (uid_t)-1)
|
|
||||||
|| (pw->pw_gid == (gid_t)-1)
|
|
||||||
|| (valid_field (pw->pw_gecos, ":\n") == -1)
|
|
||||||
|| (valid_field (pw->pw_dir, ":\n") == -1)
|
|
||||||
|| (valid_field (pw->pw_shell, ":\n") == -1)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (putpwent (pw, file) == -1) ? -1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct commonio_ops passwd_ops = {
|
|
||||||
passwd_dup,
|
|
||||||
passwd_free,
|
|
||||||
passwd_getname,
|
|
||||||
passwd_parse,
|
|
||||||
passwd_put,
|
|
||||||
fgets,
|
|
||||||
fputs,
|
|
||||||
NULL, /* open_hook */
|
|
||||||
NULL /* close_hook */
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct commonio_db passwd_db = {
|
|
||||||
PASSWD_FILE, /* filename */
|
|
||||||
&passwd_ops, /* ops */
|
|
||||||
NULL, /* fp */
|
|
||||||
#ifdef WITH_SELINUX
|
|
||||||
NULL, /* scontext */
|
|
||||||
#endif
|
|
||||||
0644, /* st_mode */
|
|
||||||
0, /* st_uid */
|
|
||||||
0, /* st_gid */
|
|
||||||
NULL, /* head */
|
|
||||||
NULL, /* tail */
|
|
||||||
NULL, /* cursor */
|
|
||||||
false, /* changed */
|
|
||||||
false, /* isopen */
|
|
||||||
false, /* locked */
|
|
||||||
false, /* readonly */
|
|
||||||
false /* setname */
|
|
||||||
};
|
|
||||||
|
|
||||||
int pw_setdbname (const char *filename)
|
|
||||||
{
|
|
||||||
return commonio_setname (&passwd_db, filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/const char *pw_dbname (void)
|
|
||||||
{
|
|
||||||
return passwd_db.filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pw_lock (void)
|
|
||||||
{
|
|
||||||
return commonio_lock (&passwd_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pw_open (int mode)
|
|
||||||
{
|
|
||||||
return commonio_open (&passwd_db, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/ /*@null@*/const struct passwd *pw_locate (const char *name)
|
|
||||||
{
|
|
||||||
return commonio_locate (&passwd_db, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/ /*@null@*/const struct passwd *pw_locate_uid (uid_t uid)
|
|
||||||
{
|
|
||||||
const struct passwd *pwd;
|
|
||||||
|
|
||||||
pw_rewind ();
|
|
||||||
while ( ((pwd = pw_next ()) != NULL)
|
|
||||||
&& (pwd->pw_uid != uid)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return pwd;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pw_update (const struct passwd *pw)
|
|
||||||
{
|
|
||||||
return commonio_update (&passwd_db, (const void *) pw);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pw_remove (const char *name)
|
|
||||||
{
|
|
||||||
return commonio_remove (&passwd_db, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pw_rewind (void)
|
|
||||||
{
|
|
||||||
return commonio_rewind (&passwd_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@observer@*/ /*@null@*/const struct passwd *pw_next (void)
|
|
||||||
{
|
|
||||||
return commonio_next (&passwd_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pw_close (void)
|
|
||||||
{
|
|
||||||
return commonio_close (&passwd_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pw_unlock (void)
|
|
||||||
{
|
|
||||||
return commonio_unlock (&passwd_db);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*@null@*/struct commonio_entry *__pw_get_head (void)
|
|
||||||
{
|
|
||||||
return passwd_db.head;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __pw_del_entry (const struct commonio_entry *ent)
|
|
||||||
{
|
|
||||||
commonio_del_entry (&passwd_db, ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct commonio_db *__pw_get_db (void)
|
|
||||||
{
|
|
||||||
return &passwd_db;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pw_cmp (const void *p1, const void *p2)
|
|
||||||
{
|
|
||||||
uid_t u1, u2;
|
|
||||||
|
|
||||||
if ((*(struct commonio_entry **) p1)->eptr == NULL)
|
|
||||||
return 1;
|
|
||||||
if ((*(struct commonio_entry **) p2)->eptr == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
u1 = ((struct passwd *) (*(struct commonio_entry **) p1)->eptr)->pw_uid;
|
|
||||||
u2 = ((struct passwd *) (*(struct commonio_entry **) p2)->eptr)->pw_uid;
|
|
||||||
|
|
||||||
if (u1 < u2)
|
|
||||||
return -1;
|
|
||||||
else if (u1 > u2)
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sort entries by UID */
|
|
||||||
int pw_sort ()
|
|
||||||
{
|
|
||||||
return commonio_sort (&passwd_db, pw_cmp);
|
|
||||||
}
|
|
||||||
-55
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2005 , Michał Moskal
|
|
||||||
* Copyright (c) 2005 , Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2008 , Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 _PWIO_H
|
|
||||||
#define _PWIO_H
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
|
|
||||||
extern int pw_close (void);
|
|
||||||
extern /*@observer@*/ /*@null@*/const struct passwd *pw_locate (const char *name);
|
|
||||||
extern /*@observer@*/ /*@null@*/const struct passwd *pw_locate_uid (uid_t uid);
|
|
||||||
extern int pw_lock (void);
|
|
||||||
extern int pw_setdbname (const char *filename);
|
|
||||||
extern /*@observer@*/const char *pw_dbname (void);
|
|
||||||
extern /*@observer@*/ /*@null@*/const struct passwd *pw_next (void);
|
|
||||||
extern int pw_open (int mode);
|
|
||||||
extern int pw_remove (const char *name);
|
|
||||||
extern int pw_rewind (void);
|
|
||||||
extern int pw_unlock (void);
|
|
||||||
extern int pw_update (const struct passwd *pw);
|
|
||||||
extern int pw_sort (void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
-106
@@ -1,106 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1990 - 1994, Julianne Frances Haugh
|
|
||||||
* Copyright (c) 1996 - 2000, Marek Michałkiewicz
|
|
||||||
* Copyright (c) 2001 , Michał Moskal
|
|
||||||
* Copyright (c) 2003 - 2005, Tomasz Kłoczko
|
|
||||||
* Copyright (c) 2007 - 2013, Nicolas François
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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>
|
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "defines.h"
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "pwio.h"
|
|
||||||
|
|
||||||
/*@null@*/ /*@only@*/struct passwd *__pw_dup (const struct passwd *pwent)
|
|
||||||
{
|
|
||||||
struct passwd *pw;
|
|
||||||
|
|
||||||
pw = (struct passwd *) malloc (sizeof *pw);
|
|
||||||
if (NULL == pw) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/* The libc might define other fields. They won't be copied. */
|
|
||||||
memset (pw, 0, sizeof *pw);
|
|
||||||
pw->pw_uid = pwent->pw_uid;
|
|
||||||
pw->pw_gid = pwent->pw_gid;
|
|
||||||
/*@-mustfreeonly@*/
|
|
||||||
pw->pw_name = strdup (pwent->pw_name);
|
|
||||||
/*@=mustfreeonly@*/
|
|
||||||
if (NULL == pw->pw_name) {
|
|
||||||
pw_free(pw);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/*@-mustfreeonly@*/
|
|
||||||
pw->pw_passwd = strdup (pwent->pw_passwd);
|
|
||||||
/*@=mustfreeonly@*/
|
|
||||||
if (NULL == pw->pw_passwd) {
|
|
||||||
pw_free(pw);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/*@-mustfreeonly@*/
|
|
||||||
pw->pw_gecos = strdup (pwent->pw_gecos);
|
|
||||||
/*@=mustfreeonly@*/
|
|
||||||
if (NULL == pw->pw_gecos) {
|
|
||||||
pw_free(pw);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/*@-mustfreeonly@*/
|
|
||||||
pw->pw_dir = strdup (pwent->pw_dir);
|
|
||||||
/*@=mustfreeonly@*/
|
|
||||||
if (NULL == pw->pw_dir) {
|
|
||||||
pw_free(pw);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/*@-mustfreeonly@*/
|
|
||||||
pw->pw_shell = strdup (pwent->pw_shell);
|
|
||||||
/*@=mustfreeonly@*/
|
|
||||||
if (NULL == pw->pw_shell) {
|
|
||||||
pw_free(pw);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pw;
|
|
||||||
}
|
|
||||||
|
|
||||||
void pw_free (/*@out@*/ /*@only@*/struct passwd *pwent)
|
|
||||||
{
|
|
||||||
free (pwent->pw_name);
|
|
||||||
if (pwent->pw_passwd) {
|
|
||||||
memzero (pwent->pw_passwd, strlen (pwent->pw_passwd));
|
|
||||||
free (pwent->pw_passwd);
|
|
||||||
}
|
|
||||||
free (pwent->pw_gecos);
|
|
||||||
free (pwent->pw_dir);
|
|
||||||
free (pwent->pw_shell);
|
|
||||||
free (pwent);
|
|
||||||
}
|
|
||||||
|
|
||||||
-203
@@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2011 , Peter Vrabec <pvrabec@redhat.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 WITH_SELINUX
|
|
||||||
|
|
||||||
#include "defines.h"
|
|
||||||
|
|
||||||
#include <selinux/selinux.h>
|
|
||||||
#include <selinux/context.h>
|
|
||||||
#include "prototypes.h"
|
|
||||||
|
|
||||||
|
|
||||||
static bool selinux_checked = false;
|
|
||||||
static bool selinux_enabled;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* set_selinux_file_context - Set the security context before any file or
|
|
||||||
* directory creation.
|
|
||||||
*
|
|
||||||
* set_selinux_file_context () should be called before any creation
|
|
||||||
* of file, symlink, directory, ...
|
|
||||||
*
|
|
||||||
* Callers may have to Reset SELinux to create files with default
|
|
||||||
* contexts with reset_selinux_file_context
|
|
||||||
*/
|
|
||||||
int set_selinux_file_context (const char *dst_name)
|
|
||||||
{
|
|
||||||
/*@null@*/security_context_t scontext = NULL;
|
|
||||||
|
|
||||||
if (!selinux_checked) {
|
|
||||||
selinux_enabled = is_selinux_enabled () > 0;
|
|
||||||
selinux_checked = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selinux_enabled) {
|
|
||||||
/* Get the default security context for this file */
|
|
||||||
if (matchpathcon (dst_name, 0, &scontext) < 0) {
|
|
||||||
if (security_getenforce () != 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Set the security context for the next created file */
|
|
||||||
if (setfscreatecon (scontext) < 0) {
|
|
||||||
if (security_getenforce () != 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
freecon (scontext);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* reset_selinux_file_context - Reset the security context to the default
|
|
||||||
* policy behavior
|
|
||||||
*
|
|
||||||
* reset_selinux_file_context () should be called after the context
|
|
||||||
* was changed with set_selinux_file_context ()
|
|
||||||
*/
|
|
||||||
int reset_selinux_file_context (void)
|
|
||||||
{
|
|
||||||
if (!selinux_checked) {
|
|
||||||
selinux_enabled = is_selinux_enabled () > 0;
|
|
||||||
selinux_checked = true;
|
|
||||||
}
|
|
||||||
if (selinux_enabled) {
|
|
||||||
if (setfscreatecon (NULL) != 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Log callback for libselinux internal error reporting.
|
|
||||||
*/
|
|
||||||
__attribute__((__format__ (printf, 2, 3)))
|
|
||||||
static int selinux_log_cb (int type, const char *fmt, ...) {
|
|
||||||
va_list ap;
|
|
||||||
char *buf;
|
|
||||||
int r;
|
|
||||||
#ifdef WITH_AUDIT
|
|
||||||
static int selinux_audit_fd = -2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
va_start (ap, fmt);
|
|
||||||
r = vasprintf (&buf, fmt, ap);
|
|
||||||
va_end (ap);
|
|
||||||
|
|
||||||
if (r < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WITH_AUDIT
|
|
||||||
if (-2 == selinux_audit_fd) {
|
|
||||||
selinux_audit_fd = audit_open ();
|
|
||||||
|
|
||||||
if (-1 == selinux_audit_fd) {
|
|
||||||
/* You get these only when the kernel doesn't have
|
|
||||||
* audit compiled in. */
|
|
||||||
if ( (errno != EINVAL)
|
|
||||||
&& (errno != EPROTONOSUPPORT)
|
|
||||||
&& (errno != EAFNOSUPPORT)) {
|
|
||||||
|
|
||||||
(void) fputs (_("Cannot open audit interface.\n"),
|
|
||||||
stderr);
|
|
||||||
SYSLOG ((LOG_WARN, "Cannot open audit interface."));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-1 != selinux_audit_fd) {
|
|
||||||
if (SELINUX_AVC == type) {
|
|
||||||
if (audit_log_user_avc_message (selinux_audit_fd,
|
|
||||||
AUDIT_USER_AVC, buf, NULL, NULL,
|
|
||||||
NULL, 0) > 0) {
|
|
||||||
goto skip_syslog;
|
|
||||||
}
|
|
||||||
} else if (SELINUX_ERROR == type) {
|
|
||||||
if (audit_log_user_avc_message (selinux_audit_fd,
|
|
||||||
AUDIT_USER_SELINUX_ERR, buf, NULL, NULL,
|
|
||||||
NULL, 0) > 0) {
|
|
||||||
goto skip_syslog;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SYSLOG ((LOG_WARN, "libselinux: %s", buf));
|
|
||||||
|
|
||||||
skip_syslog:
|
|
||||||
free (buf);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* check_selinux_permit - Check whether SELinux grants the given
|
|
||||||
* operation
|
|
||||||
*
|
|
||||||
* Parameter is the SELinux permission name, e.g. rootok
|
|
||||||
*
|
|
||||||
* Returns 0 when permission is granted
|
|
||||||
* or something failed but running in
|
|
||||||
* permissive mode
|
|
||||||
*/
|
|
||||||
int check_selinux_permit (const char *perm_name)
|
|
||||||
{
|
|
||||||
char *user_context_str;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
if (0 == is_selinux_enabled ()) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
selinux_set_callback (SELINUX_CB_LOG, (union selinux_callback) selinux_log_cb);
|
|
||||||
|
|
||||||
if (getprevcon (&user_context_str) != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("%s: can not get previous SELinux process context: %s\n"),
|
|
||||||
Prog, strerror (errno));
|
|
||||||
SYSLOG ((LOG_WARN,
|
|
||||||
"can not get previous SELinux process context: %s",
|
|
||||||
strerror (errno)));
|
|
||||||
return (security_getenforce () != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = selinux_check_access (user_context_str, user_context_str, "passwd", perm_name, NULL);
|
|
||||||
freecon (user_context_str);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* !WITH_SELINUX */
|
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
|
||||||
#endif /* !WITH_SELINUX */
|
|
||||||
-378
@@ -1,378 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2010 , Jakub Hrozek <jhrozek@redhat.com>
|
|
||||||
* Copyright (c) 2011 , Peter Vrabec <pvrabec@redhat.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce 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 of the copyright holders or contributors may not 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
|
|
||||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (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 WITH_SELINUX
|
|
||||||
|
|
||||||
#include "defines.h"
|
|
||||||
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <selinux/selinux.h>
|
|
||||||
#include <semanage/semanage.h>
|
|
||||||
#include "prototypes.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DEFAULT_SERANGE
|
|
||||||
#define DEFAULT_SERANGE "s0"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void semanage_error_callback (unused void *varg,
|
|
||||||
semanage_handle_t *handle,
|
|
||||||
const char *fmt, ...)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
char * message = NULL;
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
|
|
||||||
va_start (ap, fmt);
|
|
||||||
ret = vasprintf (&message, fmt, ap);
|
|
||||||
va_end (ap);
|
|
||||||
if (ret < 0) {
|
|
||||||
/* ENOMEM */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (semanage_msg_get_level (handle)) {
|
|
||||||
case SEMANAGE_MSG_ERR:
|
|
||||||
case SEMANAGE_MSG_WARN:
|
|
||||||
fprintf (stderr, _("[libsemanage]: %s\n"), message);
|
|
||||||
break;
|
|
||||||
case SEMANAGE_MSG_INFO:
|
|
||||||
/* nop */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
free (message);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static semanage_handle_t *semanage_init (void)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
semanage_handle_t *handle = NULL;
|
|
||||||
|
|
||||||
handle = semanage_handle_create ();
|
|
||||||
if (NULL == handle) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Cannot create SELinux management handle\n"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
semanage_msg_set_callback (handle, semanage_error_callback, NULL);
|
|
||||||
|
|
||||||
ret = semanage_is_managed (handle);
|
|
||||||
if (ret != 1) {
|
|
||||||
fprintf (stderr, _("SELinux policy not managed\n"));
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_access_check (handle);
|
|
||||||
if (ret < SEMANAGE_CAN_READ) {
|
|
||||||
fprintf (stderr, _("Cannot read SELinux policy store\n"));
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_connect (handle);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Cannot establish SELinux management connection\n"));
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_begin_transaction (handle);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr, _("Cannot begin SELinux transaction\n"));
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
return handle;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
semanage_handle_destroy (handle);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int semanage_user_mod (semanage_handle_t *handle,
|
|
||||||
semanage_seuser_key_t *key,
|
|
||||||
const char *login_name,
|
|
||||||
const char *seuser_name)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
semanage_seuser_t *seuser = NULL;
|
|
||||||
|
|
||||||
semanage_seuser_query (handle, key, &seuser);
|
|
||||||
if (NULL == seuser) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Could not query seuser for %s\n"), login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_set_mlsrange (handle, seuser, DEFAULT_SERANGE);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Could not set serange for %s\n"), login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_set_sename (handle, seuser, seuser_name);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Could not set sename for %s\n"),
|
|
||||||
login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_modify_local (handle, key, seuser);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Could not modify login mapping for %s\n"),
|
|
||||||
login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
done:
|
|
||||||
semanage_seuser_free (seuser);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int semanage_user_add (semanage_handle_t *handle,
|
|
||||||
semanage_seuser_key_t *key,
|
|
||||||
const char *login_name,
|
|
||||||
const char *seuser_name)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
semanage_seuser_t *seuser = NULL;
|
|
||||||
|
|
||||||
ret = semanage_seuser_create (handle, &seuser);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Cannot create SELinux login mapping for %s\n"),
|
|
||||||
login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_set_name (handle, seuser, login_name);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr, _("Could not set name for %s\n"), login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_set_mlsrange (handle, seuser, DEFAULT_SERANGE);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Could not set serange for %s\n"),
|
|
||||||
login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_set_sename (handle, seuser, seuser_name);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Could not set SELinux user for %s\n"),
|
|
||||||
login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_modify_local (handle, key, seuser);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Could not add login mapping for %s\n"),
|
|
||||||
login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
done:
|
|
||||||
semanage_seuser_free (seuser);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int set_seuser (const char *login_name, const char *seuser_name)
|
|
||||||
{
|
|
||||||
semanage_handle_t *handle = NULL;
|
|
||||||
semanage_seuser_key_t *key = NULL;
|
|
||||||
int ret;
|
|
||||||
int seuser_exists = 0;
|
|
||||||
|
|
||||||
if (NULL == seuser_name) {
|
|
||||||
/* don't care, just let system pick the defaults */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
handle = semanage_init ();
|
|
||||||
if (NULL == handle) {
|
|
||||||
fprintf (stderr, _("Cannot init SELinux management\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_key_create (handle, login_name, &key);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr, _("Cannot create SELinux user key\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_exists (handle, key, &seuser_exists);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf (stderr, _("Cannot verify the SELinux user\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 != seuser_exists) {
|
|
||||||
ret = semanage_user_mod (handle, key, login_name, seuser_name);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Cannot modify SELinux user mapping\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = semanage_user_add (handle, key, login_name, seuser_name);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Cannot add SELinux user mapping\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_commit (handle);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf (stderr, _("Cannot commit SELinux transaction\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
done:
|
|
||||||
semanage_seuser_key_free (key);
|
|
||||||
semanage_handle_destroy (handle);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int del_seuser (const char *login_name)
|
|
||||||
{
|
|
||||||
semanage_handle_t *handle = NULL;
|
|
||||||
semanage_seuser_key_t *key = NULL;
|
|
||||||
int ret;
|
|
||||||
int exists = 0;
|
|
||||||
|
|
||||||
handle = semanage_init ();
|
|
||||||
if (NULL == handle) {
|
|
||||||
fprintf (stderr, _("Cannot init SELinux management\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_key_create (handle, login_name, &key);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr, _("Cannot create SELinux user key\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_exists (handle, key, &exists);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf (stderr, _("Cannot verify the SELinux user\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == exists) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Login mapping for %s is not defined, OK if default mapping was used\n"),
|
|
||||||
login_name);
|
|
||||||
ret = 0; /* probably default mapping */
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_exists_local (handle, key, &exists);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf (stderr, _("Cannot verify the SELinux user\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 == exists) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Login mapping for %s is defined in policy, cannot be deleted\n"),
|
|
||||||
login_name);
|
|
||||||
ret = 0; /* Login mapping defined in policy can't be deleted */
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_seuser_del_local (handle, key);
|
|
||||||
if (ret != 0) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("Could not delete login mapping for %s"),
|
|
||||||
login_name);
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = semanage_commit (handle);
|
|
||||||
if (ret < 0) {
|
|
||||||
fprintf (stderr, _("Cannot commit SELinux transaction\n"));
|
|
||||||
ret = 1;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
done:
|
|
||||||
semanage_handle_destroy (handle);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#else /* !WITH_SELINUX */
|
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
|
||||||
#endif /* !WITH_SELINUX */
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user