Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9f68246a01 | |||
| e8b8d7a84b | |||
| 0fda4df4f1 | |||
| f7f4fd7c05 |
@@ -3,11 +3,20 @@ reports and various comments. This list may be incomplete, I received
|
|||||||
a lot of mail...
|
a lot of mail...
|
||||||
|
|
||||||
# Maintainers
|
# Maintainers
|
||||||
|
* Marek Michałkiewicz <marekm72@gmail.com> (1995-2000)
|
||||||
* Tomasz Kłoczko <kloczek@pld.org.pl> (2000-2007)
|
* Tomasz Kłoczko <kloczek@pld.org.pl> (2000-2007)
|
||||||
* Nicolas François <nicolas.francois@centraliens.net> (2007-2014)
|
* Nicolas François <nicolas.francois@centraliens.net> (2007-2014)
|
||||||
* Serge E. Hallyn <serge@hallyn.com> (2014-now)
|
* Serge E. Hallyn <serge@hallyn.com> (2014-now)
|
||||||
* Christian Brauner <christian@brauner.io> (2019-now)
|
* Christian Brauner <christian@brauner.io> (2019-now)
|
||||||
* Iker Pedrosa <ipedrosa@redhat.com> (2022-now)
|
* Iker Pedrosa <ipedrosa@redhat.com> (2022-now)
|
||||||
|
* Alejandro Colomar <alx@kernel.org> (2023-now) (4.14 stable)
|
||||||
|
|
||||||
|
To verify signatures on releases, use the following keys under keys/ :
|
||||||
|
|
||||||
|
* Serge Hallyn: keys/66D0387DB85D320F8408166DB175CFA98F192AF2.asc
|
||||||
|
* Christian Brauner: keys/4880B8C9BD0E5106FC070F4F7B3C391EFEA93624.asc
|
||||||
|
* Iker Pedrosa: keys/4E80EF49C7987B6DE2F81F5005079C6C3A653E57.asc
|
||||||
|
* Alejandro Colomar: keys/A9348594CE31283A826FBDD8D57633D441E25BB5.asc
|
||||||
|
|
||||||
# Authors and contributors
|
# Authors and contributors
|
||||||
* Adam Rudnicki <adam@v-lo.krakow.pl>
|
* Adam Rudnicki <adam@v-lo.krakow.pl>
|
||||||
|
|||||||
@@ -9558,7 +9558,7 @@
|
|||||||
* NEWS: release date corrected.
|
* NEWS: release date corrected.
|
||||||
|
|
||||||
* NEWS, src/su.c:
|
* NEWS, src/su.c:
|
||||||
fixed set enviroment too early when using PAM, so move it to !USE_PAM
|
fixed set environment too early when using PAM, so move it to !USE_PAM
|
||||||
(patch submitted by Mike Frysinger <vapier@gentoo.org>).
|
(patch submitted by Mike Frysinger <vapier@gentoo.org>).
|
||||||
|
|
||||||
2006-07-30 Tomasz Kłoczko <kloczek@pld.org.pl>
|
2006-07-30 Tomasz Kłoczko <kloczek@pld.org.pl>
|
||||||
@@ -10245,7 +10245,7 @@
|
|||||||
* NEWS: cleanups.
|
* NEWS: cleanups.
|
||||||
|
|
||||||
* autogen.sh:
|
* autogen.sh:
|
||||||
by default in development enviroment use CFLAGS="-O2 -Wall".
|
by default in development environment use CFLAGS="-O2 -Wall".
|
||||||
|
|
||||||
* src/chgpasswd.c (main): remove two unused variables (newgr and now).
|
* src/chgpasswd.c (main): remove two unused variables (newgr and now).
|
||||||
|
|
||||||
@@ -11654,7 +11654,7 @@
|
|||||||
in OPTIONS section). Describe -a and -k options.
|
in OPTIONS section). Describe -a and -k options.
|
||||||
|
|
||||||
* NEWS, src/su.c:
|
* NEWS, src/su.c:
|
||||||
fixed twice copy enviroment which causes auth problems (bug was introduced in 4.0.12;
|
fixed twice copy environment which causes auth problems (bug was introduced in 4.0.12;
|
||||||
fix by Nicolas François <nicolas.francois@centraliens.net>).
|
fix by Nicolas François <nicolas.francois@centraliens.net>).
|
||||||
|
|
||||||
* src/passwd.c, po/ja.po, po/ko.po, po/nb.po, po/nl.po, po/nn.po, po/pl.po, po/pt.po, po/pt_BR.po, po/ro.po, po/ru.po, po/sk.po, po/sq.po, po/sv.po, po/tl.po, po/tr.po, po/uk.po, po/vi.po, po/zh_CN.po, po/zh_TW.po, po/bs.po, po/ca.po, po/cs.po, po/da.po, po/de.po, po/el.po, po/es.po, po/eu.po, po/fi.po, po/fr.po, po/he.po, po/id.po, po/it.po:
|
* src/passwd.c, po/ja.po, po/ko.po, po/nb.po, po/nl.po, po/nn.po, po/pl.po, po/pt.po, po/pt_BR.po, po/ro.po, po/ru.po, po/sk.po, po/sq.po, po/sv.po, po/tl.po, po/tr.po, po/uk.po, po/vi.po, po/zh_CN.po, po/zh_TW.po, po/bs.po, po/ca.po, po/cs.po, po/da.po, po/de.po, po/el.po, po/es.po, po/eu.po, po/fi.po, po/fr.po, po/he.po, po/id.po, po/it.po:
|
||||||
@@ -12584,7 +12584,7 @@
|
|||||||
http://bugs.debian.org/48002
|
http://bugs.debian.org/48002
|
||||||
|
|
||||||
* src/login.c, NEWS:
|
* src/login.c, NEWS:
|
||||||
fixed loggin of username on succesful login (was using the normal username,
|
fixed loggin of username on successful login (was using the normal username,
|
||||||
when it should have used pam_user) http://bugs.debian.org/47819
|
when it should have used pam_user) http://bugs.debian.org/47819
|
||||||
|
|
||||||
2005-06-02 Tomasz Kłoczko <kloczek@pld.org.pl>
|
2005-06-02 Tomasz Kłoczko <kloczek@pld.org.pl>
|
||||||
@@ -13029,7 +13029,7 @@
|
|||||||
* man/pl/usermod.8: finish sync with english version.
|
* man/pl/usermod.8: finish sync with english version.
|
||||||
|
|
||||||
* man/hu/login.1, man/pl/login.1, NEWS, man/Attic/login.1, man/de/login.1:
|
* man/hu/login.1, man/pl/login.1, NEWS, man/Attic/login.1, man/de/login.1:
|
||||||
removed fragment about abilities pass enviroment variables in login prompt.
|
removed fragment about abilities pass environment variables in login prompt.
|
||||||
|
|
||||||
* man/Attic/gpasswd.1, man/Attic/newgrp.1:
|
* man/Attic/gpasswd.1, man/Attic/newgrp.1:
|
||||||
fixes by Nicolas Nicolas François <nicolas.francois@centraliens.net> (not all
|
fixes by Nicolas Nicolas François <nicolas.francois@centraliens.net> (not all
|
||||||
@@ -13508,7 +13508,7 @@
|
|||||||
removed not used translations.
|
removed not used translations.
|
||||||
|
|
||||||
* NEWS, src/su.c:
|
* NEWS, src/su.c:
|
||||||
fix adding of pam_env env variables to enviroment (Martin Schlemmer <azarah@nosferatu.za.org>).
|
fix adding of pam_env env variables to environment (Martin Schlemmer <azarah@nosferatu.za.org>).
|
||||||
|
|
||||||
* NEWS, configure.in:
|
* NEWS, configure.in:
|
||||||
fixed filling MAIL_SPOOL_DIR and MAIL_SPOOL_FILE variables which was allways
|
fixed filling MAIL_SPOOL_DIR and MAIL_SPOOL_FILE variables which was allways
|
||||||
@@ -13605,7 +13605,7 @@
|
|||||||
|
|
||||||
* NEWS, src/su.c:
|
* NEWS, src/su.c:
|
||||||
add pam_open_session() support. If builded without PAM support
|
add pam_open_session() support. If builded without PAM support
|
||||||
propagate $DISPLAY and $XAUTHORITY enviroment variables.
|
propagate $DISPLAY and $XAUTHORITY environment variables.
|
||||||
Based on http://www.gentoo.org/cgi-bin/viewcvs.cgi/sys-apps/shadow/files/shadow-4.0.4.1-su-pam_open_session.patch?rev=1.1
|
Based on http://www.gentoo.org/cgi-bin/viewcvs.cgi/sys-apps/shadow/files/shadow-4.0.4.1-su-pam_open_session.patch?rev=1.1
|
||||||
|
|
||||||
2004-10-23 Tomasz Kłoczko <kloczek@pld.org.pl>
|
2004-10-23 Tomasz Kłoczko <kloczek@pld.org.pl>
|
||||||
|
|||||||
+17
-3
@@ -1,15 +1,29 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
EXTRA_DIST = NEWS README TODO shadow.spec.in
|
EXTRA_DIST = NEWS README
|
||||||
|
|
||||||
SUBDIRS = libmisc lib
|
SUBDIRS = lib
|
||||||
|
|
||||||
if ENABLE_SUBIDS
|
if ENABLE_SUBIDS
|
||||||
SUBDIRS += libsubid
|
SUBDIRS += libsubid
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SUBDIRS += src po contrib doc etc
|
SUBDIRS += src po contrib doc etc tests/unit
|
||||||
|
|
||||||
if ENABLE_REGENERATE_MAN
|
if ENABLE_REGENERATE_MAN
|
||||||
SUBDIRS += man
|
SUBDIRS += man
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
CLEANFILES = man/8.out man/po/remove-potcdate.* man/*/login.defs.d man/*/*.mo
|
||||||
|
|
||||||
|
EXTRA_DIST = tests/
|
||||||
|
|
||||||
|
dist-hook:
|
||||||
|
chmod -R u+w $(distdir)/tests
|
||||||
|
chmod u+w $(distdir)
|
||||||
|
mv $(distdir)/tests/unit $(distdir)/realunittest
|
||||||
|
mv $(distdir)/tests/tests $(distdir)/realtests
|
||||||
|
rm -rf $(distdir)/tests
|
||||||
|
mv $(distdir)/realtests $(distdir)/tests
|
||||||
|
rm -rf $(distdir)/tests/unit $(distdir)/tests/Makefile*
|
||||||
|
mv $(distdir)/realunittest $(distdir)/tests/unit
|
||||||
|
|||||||
+40
-13
@@ -108,7 +108,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
|||||||
configure.lineno config.status.lineno
|
configure.lineno config.status.lineno
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
CONFIG_HEADER = config.h
|
CONFIG_HEADER = config.h
|
||||||
CONFIG_CLEAN_FILES = man/po/Makefile shadow.spec
|
CONFIG_CLEAN_FILES = man/po/Makefile
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
CONFIG_CLEAN_VPATH_FILES =
|
||||||
AM_V_P = $(am__v_P_@AM_V@)
|
AM_V_P = $(am__v_P_@AM_V@)
|
||||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||||
@@ -163,12 +163,11 @@ am__define_uniq_tagged_files = \
|
|||||||
unique=`for i in $$list; do \
|
unique=`for i in $$list; do \
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||||
done | $(am__uniquify_input)`
|
done | $(am__uniquify_input)`
|
||||||
DIST_SUBDIRS = libmisc lib libsubid src po contrib doc etc man
|
DIST_SUBDIRS = lib libsubid src po contrib doc etc tests/unit man
|
||||||
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
|
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
|
||||||
$(srcdir)/shadow.spec.in $(top_srcdir)/man/po/Makefile.in \
|
$(top_srcdir)/man/po/Makefile.in ABOUT-NLS AUTHORS.md COPYING \
|
||||||
ABOUT-NLS AUTHORS.md COPYING ChangeLog NEWS README TODO \
|
ChangeLog NEWS README compile config.guess config.rpath \
|
||||||
compile config.guess config.rpath config.sub install-sh \
|
config.sub install-sh ltmain.sh missing
|
||||||
ltmain.sh missing
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
distdir = $(PACKAGE)-$(VERSION)
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
top_distdir = $(distdir)
|
top_distdir = $(distdir)
|
||||||
@@ -224,6 +223,8 @@ AWK = @AWK@
|
|||||||
CC = @CC@
|
CC = @CC@
|
||||||
CCDEPMODE = @CCDEPMODE@
|
CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
|
CMOCKA_CFLAGS = @CMOCKA_CFLAGS@
|
||||||
|
CMOCKA_LIBS = @CMOCKA_LIBS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CSCOPE = @CSCOPE@
|
CSCOPE = @CSCOPE@
|
||||||
@@ -242,6 +243,7 @@ EGREP = @EGREP@
|
|||||||
ETAGS = @ETAGS@
|
ETAGS = @ETAGS@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
FILECMD = @FILECMD@
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
||||||
GMSGFMT = @GMSGFMT@
|
GMSGFMT = @GMSGFMT@
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
GMSGFMT_015 = @GMSGFMT_015@
|
||||||
@@ -257,9 +259,15 @@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|||||||
LD = @LD@
|
LD = @LD@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBACL = @LIBACL@
|
LIBACL = @LIBACL@
|
||||||
|
LIBADD_DL = @LIBADD_DL@
|
||||||
|
LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
|
||||||
|
LIBADD_DLOPEN = @LIBADD_DLOPEN@
|
||||||
|
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
|
||||||
LIBATTR = @LIBATTR@
|
LIBATTR = @LIBATTR@
|
||||||
LIBAUDIT = @LIBAUDIT@
|
LIBAUDIT = @LIBAUDIT@
|
||||||
LIBCRACK = @LIBCRACK@
|
LIBBSD = @LIBBSD@
|
||||||
|
LIBBSD_CFLAGS = @LIBBSD_CFLAGS@
|
||||||
|
LIBBSD_LIBS = @LIBBSD_LIBS@
|
||||||
LIBCRYPT = @LIBCRYPT@
|
LIBCRYPT = @LIBCRYPT@
|
||||||
LIBECONF = @LIBECONF@
|
LIBECONF = @LIBECONF@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
@@ -275,6 +283,7 @@ LIBSUBID_ABI = @LIBSUBID_ABI@
|
|||||||
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
||||||
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
||||||
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
||||||
|
LIBSYSTEMD = @LIBSYSTEMD@
|
||||||
LIBTCB = @LIBTCB@
|
LIBTCB = @LIBTCB@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
@@ -283,6 +292,8 @@ LN_S = @LN_S@
|
|||||||
LTLIBICONV = @LTLIBICONV@
|
LTLIBICONV = @LTLIBICONV@
|
||||||
LTLIBINTL = @LTLIBINTL@
|
LTLIBINTL = @LTLIBINTL@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_DLLOADERS = @LT_DLLOADERS@
|
||||||
|
LT_DLPREOPEN = @LT_DLPREOPEN@
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
@@ -305,6 +316,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
PKG_CONFIG = @PKG_CONFIG@
|
||||||
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
POSUB = @POSUB@
|
POSUB = @POSUB@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
SED = @SED@
|
SED = @SED@
|
||||||
@@ -376,9 +390,10 @@ target_alias = @target_alias@
|
|||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
EXTRA_DIST = NEWS README TODO shadow.spec.in
|
EXTRA_DIST = tests/
|
||||||
SUBDIRS = libmisc lib $(am__append_1) src po contrib doc etc \
|
SUBDIRS = lib $(am__append_1) src po contrib doc etc tests/unit \
|
||||||
$(am__append_2)
|
$(am__append_2)
|
||||||
|
CLEANFILES = man/8.out man/po/remove-potcdate.* man/*/login.defs.d man/*/*.mo
|
||||||
all: config.h
|
all: config.h
|
||||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||||
|
|
||||||
@@ -433,8 +448,6 @@ distclean-hdr:
|
|||||||
-rm -f config.h stamp-h1
|
-rm -f config.h stamp-h1
|
||||||
man/po/Makefile: $(top_builddir)/config.status $(top_srcdir)/man/po/Makefile.in
|
man/po/Makefile: $(top_builddir)/config.status $(top_srcdir)/man/po/Makefile.in
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
cd $(top_builddir) && $(SHELL) ./config.status $@
|
||||||
shadow.spec: $(top_builddir)/config.status $(srcdir)/shadow.spec.in
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $@
|
|
||||||
|
|
||||||
mostlyclean-libtool:
|
mostlyclean-libtool:
|
||||||
-rm -f *.lo
|
-rm -f *.lo
|
||||||
@@ -610,6 +623,9 @@ distdir-am: $(DISTFILES)
|
|||||||
|| exit 1; \
|
|| exit 1; \
|
||||||
fi; \
|
fi; \
|
||||||
done
|
done
|
||||||
|
$(MAKE) $(AM_MAKEFLAGS) \
|
||||||
|
top_distdir="$(top_distdir)" distdir="$(distdir)" \
|
||||||
|
dist-hook
|
||||||
-test -n "$(am__skip_mode_fix)" \
|
-test -n "$(am__skip_mode_fix)" \
|
||||||
|| find "$(distdir)" -type d ! -perm -755 \
|
|| find "$(distdir)" -type d ! -perm -755 \
|
||||||
-exec chmod u+rwx,go+rx {} \; -o \
|
-exec chmod u+rwx,go+rx {} \; -o \
|
||||||
@@ -773,6 +789,7 @@ install-strip:
|
|||||||
mostlyclean-generic:
|
mostlyclean-generic:
|
||||||
|
|
||||||
clean-generic:
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
distclean-generic:
|
distclean-generic:
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
@@ -856,8 +873,8 @@ uninstall-am:
|
|||||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||||
am--refresh check check-am clean clean-cscope clean-generic \
|
am--refresh check check-am clean clean-cscope clean-generic \
|
||||||
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
||||||
dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
|
dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
|
||||||
dist-xz dist-zip dist-zstd distcheck distclean \
|
dist-tarZ dist-xz dist-zip dist-zstd distcheck distclean \
|
||||||
distclean-generic distclean-hdr distclean-libtool \
|
distclean-generic distclean-hdr distclean-libtool \
|
||||||
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
distclean-tags distcleancheck distdir distuninstallcheck dvi \
|
||||||
dvi-am html html-am info info-am install install-am \
|
dvi-am html html-am info info-am install install-am \
|
||||||
@@ -873,6 +890,16 @@ uninstall-am:
|
|||||||
.PRECIOUS: Makefile
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
|
||||||
|
dist-hook:
|
||||||
|
chmod -R u+w $(distdir)/tests
|
||||||
|
chmod u+w $(distdir)
|
||||||
|
mv $(distdir)/tests/unit $(distdir)/realunittest
|
||||||
|
mv $(distdir)/tests/tests $(distdir)/realtests
|
||||||
|
rm -rf $(distdir)/tests
|
||||||
|
mv $(distdir)/realtests $(distdir)/tests
|
||||||
|
rm -rf $(distdir)/tests/unit $(distdir)/tests/Makefile*
|
||||||
|
mv $(distdir)/realunittest $(distdir)/tests/unit
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
# 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.
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
.NOEXPORT:
|
.NOEXPORT:
|
||||||
|
|||||||
@@ -696,7 +696,7 @@ shadow-4.0.18 -> shadow-4.0.18.1 03-08-2006
|
|||||||
shadow-4.0.17 -> shadow-4.0.18 01-08-2006
|
shadow-4.0.17 -> shadow-4.0.18 01-08-2006
|
||||||
|
|
||||||
*** general:
|
*** general:
|
||||||
- su: fixed set enviroment too early when using PAM, so move it to !USE_PAM
|
- su: fixed set environment too early when using PAM, so move it to !USE_PAM
|
||||||
(patch submitted by Mike Frysinger <vapier@gentoo.org>),
|
(patch submitted by Mike Frysinger <vapier@gentoo.org>),
|
||||||
- groupadd, groupmod, useradd, usermod: fixed UID/GID overflow (fixed
|
- groupadd, groupmod, useradd, usermod: fixed UID/GID overflow (fixed
|
||||||
http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=198920)
|
http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=198920)
|
||||||
@@ -855,7 +855,7 @@ shadow-4.0.14 -> shadow-4.0.15 13-03-2006
|
|||||||
- su: move exit() outside libmisc/shell.c::shell() for handle shell() errors
|
- su: move exit() outside libmisc/shell.c::shell() for handle shell() errors
|
||||||
on higher level (now is better visable where some programs exit with 126
|
on higher level (now is better visable where some programs exit with 126
|
||||||
and 127 exit codes); added new shell() parameter (char *const envp[])
|
and 127 exit codes); added new shell() parameter (char *const envp[])
|
||||||
which allow fix preserving enviroment in su on using -p, (patch by
|
which allow fix preserving environment in su on using -p, (patch by
|
||||||
Alexander Gattin <xrgtn@yandex.ru>),
|
Alexander Gattin <xrgtn@yandex.ru>),
|
||||||
- su: added handle -c,--command option for GNU su compliance (merge
|
- su: added handle -c,--command option for GNU su compliance (merge
|
||||||
437_su_-c_option Debian patch),
|
437_su_-c_option Debian patch),
|
||||||
@@ -966,7 +966,7 @@ shadow-4.0.12 -> shadow-4.0.13 10-10-2005
|
|||||||
to example described in ident(1) man page (modern compilers like latest GCC
|
to example described in ident(1) man page (modern compilers like latest GCC
|
||||||
removes not used functions by global optimization).
|
removes not used functions by global optimization).
|
||||||
So "ident /usr/bin/passwd" will show again some useable informations
|
So "ident /usr/bin/passwd" will show again some useable informations
|
||||||
- su: fixed twice copy enviroment which causes auth problems
|
- su: fixed twice copy environment which causes auth problems
|
||||||
(bug was introduced in 4.0.12; fix by Nicolas François <nicolas.francois@centraliens.net>),
|
(bug was introduced in 4.0.12; fix by Nicolas François <nicolas.francois@centraliens.net>),
|
||||||
- chage: differentiate the different failure causes by the exit value
|
- chage: differentiate the different failure causes by the exit value
|
||||||
This will permit to adduser Debian script to detect if chage failed because the
|
This will permit to adduser Debian script to detect if chage failed because the
|
||||||
@@ -1133,7 +1133,7 @@ shadow-4.0.9 -> shadow-4.0.10 28-06-2005
|
|||||||
http://bugs.debian.org/53702
|
http://bugs.debian.org/53702
|
||||||
- login: check for hushed login and pass PAM_SILENT if true,
|
- login: check for hushed login and pass PAM_SILENT if true,
|
||||||
http://bugs.debian.org/48002
|
http://bugs.debian.org/48002
|
||||||
- login: fixed username on succesful login (was using the normal username,
|
- login: fixed username on successful login (was using the normal username,
|
||||||
when it should have used pam_user) http://bugs.debian.org/47819
|
when it should have used pam_user) http://bugs.debian.org/47819
|
||||||
- remove using SHADOWPWD #define so now shadow is always built with shadow
|
- remove using SHADOWPWD #define so now shadow is always built with shadow
|
||||||
password support,
|
password support,
|
||||||
@@ -1212,7 +1212,7 @@ shadow-4.0.7 -> shadow-4.0.8 26-04-2005
|
|||||||
(without gshadow) doesn't permit to use newgrp,
|
(without gshadow) doesn't permit to use newgrp,
|
||||||
- newgrp(1): newgrp uses /bin/sh (not bash),
|
- newgrp(1): newgrp uses /bin/sh (not bash),
|
||||||
- faillog(8): updated after rewritten faillog command for use getopt_long(),
|
- faillog(8): updated after rewritten faillog command for use getopt_long(),
|
||||||
- login(1): removed fragment about abilities pass enviroment variables in login prompt,
|
- login(1): removed fragment about abilities pass environment variables in login prompt,
|
||||||
- gshadow(5): new file (by Nicolas Nicolas François <nicolas.francois@centraliens.net>),
|
- gshadow(5): new file (by Nicolas Nicolas François <nicolas.francois@centraliens.net>),
|
||||||
- usermod(8): fixed #302388 Debian bug: added separated -o option description,
|
- usermod(8): fixed #302388 Debian bug: added separated -o option description,
|
||||||
|
|
||||||
@@ -1242,7 +1242,7 @@ shadow-4.0.6 -> shadow-4.0.7 26-01-2005
|
|||||||
|
|
||||||
shadow-4.0.5 -> shadow-4.0.6 08-11-2004
|
shadow-4.0.5 -> shadow-4.0.6 08-11-2004
|
||||||
|
|
||||||
- su: fixed adding of pam_env env variables to enviroment
|
- su: fixed adding of pam_env env variables to environment
|
||||||
(Martin Schlemmer <azarah@nosferatu.za.org>),
|
(Martin Schlemmer <azarah@nosferatu.za.org>),
|
||||||
- autoconf: fixed filling MAIL_SPOOL_DIR and MAIL_SPOOL_FILE variables
|
- autoconf: fixed filling MAIL_SPOOL_DIR and MAIL_SPOOL_FILE variables
|
||||||
which was always empty (Gregorio Guidi <g.guidi@sns.it>),
|
which was always empty (Gregorio Guidi <g.guidi@sns.it>),
|
||||||
@@ -1275,7 +1275,7 @@ shadow-4.0.4.1 -> shadow-4.0.5 27-10-2004
|
|||||||
including symlinks placed into /etc/skel/public_html for example.
|
including symlinks placed into /etc/skel/public_html for example.
|
||||||
http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=66819
|
http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=66819
|
||||||
- su: add pam_open_session() support. If built without PAM support
|
- su: add pam_open_session() support. If built without PAM support
|
||||||
propagate $DISPLAY and $XAUTHORITY enviroment variables.
|
propagate $DISPLAY and $XAUTHORITY environment variables.
|
||||||
Based on http://www.gentoo.org/cgi-bin/viewcvs.cgi/sys-apps/shadow/files/shadow-4.0.4.1-su-pam_open_session.patch?rev=1.1
|
Based on http://www.gentoo.org/cgi-bin/viewcvs.cgi/sys-apps/shadow/files/shadow-4.0.4.1-su-pam_open_session.patch?rev=1.1
|
||||||
- applied 036_pam_access_with_preauth.patch Debian patch submited by Bjorn
|
- applied 036_pam_access_with_preauth.patch Debian patch submited by Bjorn
|
||||||
Torkelsson <Bjorn.Torkelsson@hpc2n.umu.se>: add support for PAM account
|
Torkelsson <Bjorn.Torkelsson@hpc2n.umu.se>: add support for PAM account
|
||||||
|
|||||||
@@ -17,6 +17,12 @@ are used for managing group accounts.
|
|||||||
* [Issue tracker](https://github.com/shadow-maint/shadow/issues)
|
* [Issue tracker](https://github.com/shadow-maint/shadow/issues)
|
||||||
* [Releases](https://github.com/shadow-maint/shadow/releases)
|
* [Releases](https://github.com/shadow-maint/shadow/releases)
|
||||||
|
|
||||||
|
## Code
|
||||||
|
|
||||||
|
The main development branch is at [https://github.com/shadow-maint/shadow.git](https://github.com/shadow-maint/shadow)
|
||||||
|
|
||||||
|
See [STABLE.md](https://github.com/shadow-maint/shadow/blob/master/STABLE.md) for a list of supported stable branches.
|
||||||
|
|
||||||
## Contacts
|
## Contacts
|
||||||
There are several ways to contact us:
|
There are several ways to contact us:
|
||||||
* [the general discussion mailing list](
|
* [the general discussion mailing list](
|
||||||
@@ -31,6 +37,11 @@ There are several ways to contact us:
|
|||||||
https://alioth-lists-archive.debian.net/pipermail/pkg-shadow-commits/),
|
https://alioth-lists-archive.debian.net/pipermail/pkg-shadow-commits/),
|
||||||
only used for historical purposes
|
only used for historical purposes
|
||||||
|
|
||||||
|
## Contributions
|
||||||
|
|
||||||
|
Contributions are welcome. Follow the
|
||||||
|
[guidelines](doc/contributions/introduction.md) before posting any patches.
|
||||||
|
|
||||||
## Authors and maintainers
|
## Authors and maintainers
|
||||||
Authors and maintainers are listed in [AUTHORS.md](
|
Authors and maintainers are listed in [AUTHORS.md](
|
||||||
https://github.com/shadow-maint/shadow/blob/master/AUTHORS.md).
|
https://github.com/shadow-maint/shadow/blob/master/AUTHORS.md).
|
||||||
|
|||||||
@@ -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
|
|
||||||
Vendored
+1255
File diff suppressed because it is too large
Load Diff
+46
-150
@@ -4,6 +4,12 @@
|
|||||||
authenticate the callers */
|
authenticate the callers */
|
||||||
#undef ACCT_TOOLS_SETUID
|
#undef ACCT_TOOLS_SETUID
|
||||||
|
|
||||||
|
/* Define to support lastlog. */
|
||||||
|
#undef ENABLE_LASTLOG
|
||||||
|
|
||||||
|
/* Define to manage session support with logind. */
|
||||||
|
#undef ENABLE_LOGIND
|
||||||
|
|
||||||
/* Define to 1 if translation of program messages to the user's native
|
/* Define to 1 if translation of program messages to the user's native
|
||||||
language is requested. */
|
language is requested. */
|
||||||
#undef ENABLE_NLS
|
#undef ENABLE_NLS
|
||||||
@@ -54,6 +60,10 @@
|
|||||||
*/
|
*/
|
||||||
#undef HAVE_DCGETTEXT
|
#undef HAVE_DCGETTEXT
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of `cygwin_conv_path', and to 0 if
|
||||||
|
you don't. */
|
||||||
|
#undef HAVE_DECL_CYGWIN_CONV_PATH
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `PAM_DATA_SILENT', and to 0 if
|
/* Define to 1 if you have the declaration of `PAM_DATA_SILENT', and to 0 if
|
||||||
you don't. */
|
you don't. */
|
||||||
#undef HAVE_DECL_PAM_DATA_SILENT
|
#undef HAVE_DECL_PAM_DATA_SILENT
|
||||||
@@ -70,26 +80,23 @@
|
|||||||
if you don't. */
|
if you don't. */
|
||||||
#undef HAVE_DECL_PAM_NEW_AUTHTOK_REQD
|
#undef HAVE_DECL_PAM_NEW_AUTHTOK_REQD
|
||||||
|
|
||||||
|
/* Define if you have the GNU dld library. */
|
||||||
|
#undef HAVE_DLD
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `dlerror' function. */
|
||||||
|
#undef HAVE_DLERROR
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||||
#undef HAVE_DLFCN_H
|
#undef HAVE_DLFCN_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <errno.h> header file. */
|
/* Define if you have the _dyld_func_lookup function. */
|
||||||
#undef HAVE_ERRNO_H
|
#undef HAVE_DYLD
|
||||||
|
|
||||||
/* Define to 1 if you have the `explicit_bzero' function. */
|
/* Define to 1 if you have the `explicit_bzero' function. */
|
||||||
#undef HAVE_EXPLICIT_BZERO
|
#undef HAVE_EXPLICIT_BZERO
|
||||||
|
|
||||||
/* Define to 1 if you have the `fchmod' function. */
|
/* Defined to 1 if you have the declaration of 'fgetpwent_r' */
|
||||||
#undef HAVE_FCHMOD
|
#undef HAVE_FGETPWENT_R
|
||||||
|
|
||||||
/* 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. */
|
/* Define to 1 if you have the `futimes' function. */
|
||||||
#undef HAVE_FUTIMES
|
#undef HAVE_FUTIMES
|
||||||
@@ -97,18 +104,6 @@
|
|||||||
/* Define to 1 if you have the `getentropy' function. */
|
/* Define to 1 if you have the `getentropy' function. */
|
||||||
#undef HAVE_GETENTROPY
|
#undef HAVE_GETENTROPY
|
||||||
|
|
||||||
/* 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 `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 `getrandom' function. */
|
/* Define to 1 if you have the `getrandom' function. */
|
||||||
#undef HAVE_GETRANDOM
|
#undef HAVE_GETRANDOM
|
||||||
|
|
||||||
@@ -124,9 +119,6 @@
|
|||||||
/* Define to 1 if you have the `getusershell' function. */
|
/* Define to 1 if you have the `getusershell' function. */
|
||||||
#undef HAVE_GETUSERSHELL
|
#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. */
|
/* Define to 1 if you have the <gshadow.h> header file. */
|
||||||
#undef HAVE_GSHADOW_H
|
#undef HAVE_GSHADOW_H
|
||||||
|
|
||||||
@@ -142,26 +134,17 @@
|
|||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
#undef HAVE_INTTYPES_H
|
#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. */
|
/* Define to 1 if you have the <lastlog.h> header file. */
|
||||||
#undef HAVE_LASTLOG_H
|
#undef HAVE_LASTLOG_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `lckpwdf' function. */
|
/* Define to 1 if you have the `lckpwdf' function. */
|
||||||
#undef HAVE_LCKPWDF
|
#undef HAVE_LCKPWDF
|
||||||
|
|
||||||
/* Defined if you have libcrack. */
|
/* Define if you have the libdl library or equivalent. */
|
||||||
#undef HAVE_LIBCRACK
|
#undef HAVE_LIBDL
|
||||||
|
|
||||||
/* Defined if you have the ts&szs cracklib. */
|
/* Define if libdlloader will be built on this platform */
|
||||||
#undef HAVE_LIBCRACK_HIST
|
#undef HAVE_LIBDLLOADER
|
||||||
|
|
||||||
/* 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. */
|
/* Define to 1 if you have the <linux/btrfs_tree.h> header file. */
|
||||||
#undef HAVE_LINUX_BTRFS_TREE_H
|
#undef HAVE_LINUX_BTRFS_TREE_H
|
||||||
@@ -172,24 +155,15 @@
|
|||||||
/* Define if struct lastlog has ll_host */
|
/* Define if struct lastlog has ll_host */
|
||||||
#undef HAVE_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 `lutimes' function. */
|
/* Define to 1 if you have the `lutimes' function. */
|
||||||
#undef HAVE_LUTIMES
|
#undef HAVE_LUTIMES
|
||||||
|
|
||||||
/* Define to 1 if you have the `memset_s' function. */
|
/* Define to 1 if you have the `memset_explicit' function. */
|
||||||
#undef HAVE_MEMSET_S
|
#undef HAVE_MEMSET_EXPLICIT
|
||||||
|
|
||||||
/* Define to 1 if you have the <minix/config.h> header file. */
|
/* Define to 1 if you have the <minix/config.h> header file. */
|
||||||
#undef HAVE_MINIX_CONFIG_H
|
#undef HAVE_MINIX_CONFIG_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `mkdir' function. */
|
|
||||||
#undef HAVE_MKDIR
|
|
||||||
|
|
||||||
/* 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. */
|
/* Define to 1 if you have the <paths.h> header file. */
|
||||||
#undef HAVE_PATHS_H
|
#undef HAVE_PATHS_H
|
||||||
|
|
||||||
@@ -202,15 +176,15 @@
|
|||||||
/* Define to 1 if you have the `putspent' function. */
|
/* Define to 1 if you have the `putspent' function. */
|
||||||
#undef HAVE_PUTSPENT
|
#undef HAVE_PUTSPENT
|
||||||
|
|
||||||
/* Define to 1 if you have the `rename' function. */
|
/* Define to 1 if you have the <readpassphrase.h> header file. */
|
||||||
#undef HAVE_RENAME
|
#undef HAVE_READPASSPHRASE_H
|
||||||
|
|
||||||
/* 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. */
|
/* Define to 1 if you have the <rpc/key_prot.h> header file. */
|
||||||
#undef HAVE_RPC_KEY_PROT_H
|
#undef HAVE_RPC_KEY_PROT_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `rpmatch' function. */
|
||||||
|
#undef HAVE_RPMATCH
|
||||||
|
|
||||||
/* Define to 1 if you have the <security/openpam.h> header file. */
|
/* Define to 1 if you have the <security/openpam.h> header file. */
|
||||||
#undef HAVE_SECURITY_OPENPAM_H
|
#undef HAVE_SECURITY_OPENPAM_H
|
||||||
|
|
||||||
@@ -241,11 +215,8 @@
|
|||||||
/* Have working shadow group support in libc */
|
/* Have working shadow group support in libc */
|
||||||
#undef HAVE_SHADOWGRP
|
#undef HAVE_SHADOWGRP
|
||||||
|
|
||||||
/* Define to 1 if you have the `snprintf' function. */
|
/* Define if you have the shl_load function. */
|
||||||
#undef HAVE_SNPRINTF
|
#undef HAVE_SHL_LOAD
|
||||||
|
|
||||||
/* Define to 1 if stdbool.h conforms to C99. */
|
|
||||||
#undef HAVE_STDBOOL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
/* Define to 1 if you have the <stdint.h> header file. */
|
||||||
#undef HAVE_STDINT_H
|
#undef HAVE_STDINT_H
|
||||||
@@ -256,14 +227,11 @@
|
|||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
#undef HAVE_STDLIB_H
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `strcasecmp' function. */
|
/* Define to 1 if you have the `stpecpy' function. */
|
||||||
#undef HAVE_STRCASECMP
|
#undef HAVE_STPECPY
|
||||||
|
|
||||||
/* Define to 1 if you have the `strdup' function. */
|
/* Define to 1 if you have the `stpeprintf' function. */
|
||||||
#undef HAVE_STRDUP
|
#undef HAVE_STPEPRINTF
|
||||||
|
|
||||||
/* Define to 1 if you have the `strerror' function. */
|
|
||||||
#undef HAVE_STRERROR
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
/* Define to 1 if you have the <strings.h> header file. */
|
||||||
#undef HAVE_STRINGS_H
|
#undef HAVE_STRINGS_H
|
||||||
@@ -271,21 +239,6 @@
|
|||||||
/* Define to 1 if you have the <string.h> header file. */
|
/* Define to 1 if you have the <string.h> header file. */
|
||||||
#undef HAVE_STRING_H
|
#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 `ut_addr' is a member of `struct utmpx'. */
|
/* Define to 1 if `ut_addr' is a member of `struct utmpx'. */
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_ADDR
|
#undef HAVE_STRUCT_UTMPX_UT_ADDR
|
||||||
|
|
||||||
@@ -307,42 +260,6 @@
|
|||||||
/* Define to 1 if `ut_xtime' is a member of `struct utmpx'. */
|
/* Define to 1 if `ut_xtime' is a member of `struct utmpx'. */
|
||||||
#undef HAVE_STRUCT_UTMPX_UT_XTIME
|
#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. */
|
/* Define to 1 if you have the <sys/capability.h> header file. */
|
||||||
#undef HAVE_SYS_CAPABILITY_H
|
#undef HAVE_SYS_CAPABILITY_H
|
||||||
|
|
||||||
@@ -352,39 +269,24 @@
|
|||||||
/* Define to 1 if you have the <sys/random.h> header file. */
|
/* Define to 1 if you have the <sys/random.h> header file. */
|
||||||
#undef HAVE_SYS_RANDOM_H
|
#undef HAVE_SYS_RANDOM_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. */
|
/* Define to 1 if you have the <sys/statfs.h> header file. */
|
||||||
#undef HAVE_SYS_STATFS_H
|
#undef HAVE_SYS_STATFS_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
#undef HAVE_SYS_STAT_H
|
#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. */
|
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||||
#undef HAVE_SYS_TYPES_H
|
#undef HAVE_SYS_TYPES_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <tcb.h> header file. */
|
/* Define to 1 if you have the <tcb.h> header file. */
|
||||||
#undef HAVE_TCB_H
|
#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. */
|
/* Define to 1 if you have the <termio.h> header file. */
|
||||||
#undef HAVE_TERMIO_H
|
#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. */
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
#undef HAVE_UNISTD_H
|
#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. */
|
/* Define to 1 if you have the `updwtmpx' function. */
|
||||||
#undef HAVE_UPDWTMPX
|
#undef HAVE_UPDWTMPX
|
||||||
|
|
||||||
@@ -394,18 +296,15 @@
|
|||||||
/* Define to 1 if `utime(file, NULL)' sets file's timestamp to the present. */
|
/* Define to 1 if `utime(file, NULL)' sets file's timestamp to the present. */
|
||||||
#undef HAVE_UTIME_NULL
|
#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. */
|
/* Define to 1 if you have the <utmp.h> header file. */
|
||||||
#undef HAVE_UTMP_H
|
#undef HAVE_UTMP_H
|
||||||
|
|
||||||
|
/* Define to support vendor settings. */
|
||||||
|
#undef HAVE_VENDORDIR
|
||||||
|
|
||||||
/* Define to 1 if you have the <wchar.h> header file. */
|
/* Define to 1 if you have the <wchar.h> header file. */
|
||||||
#undef HAVE_WCHAR_H
|
#undef HAVE_WCHAR_H
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `_Bool'. */
|
|
||||||
#undef HAVE__BOOL
|
|
||||||
|
|
||||||
/* Path for lastlog file. */
|
/* Path for lastlog file. */
|
||||||
#undef LASTLOG_FILE
|
#undef LASTLOG_FILE
|
||||||
|
|
||||||
@@ -477,9 +376,6 @@
|
|||||||
/* Define to support /etc/suauth su access control. */
|
/* Define to support /etc/suauth su access control. */
|
||||||
#undef SU_ACCESS
|
#undef SU_ACCESS
|
||||||
|
|
||||||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
|
||||||
#undef TM_IN_SYS_TIME
|
|
||||||
|
|
||||||
/* Define to allow the bcrypt password encryption algorithm */
|
/* Define to allow the bcrypt password encryption algorithm */
|
||||||
#undef USE_BCRYPT
|
#undef USE_BCRYPT
|
||||||
|
|
||||||
@@ -495,9 +391,6 @@
|
|||||||
/* Define to support flushing of sssd caches */
|
/* Define to support flushing of sssd caches */
|
||||||
#undef USE_SSSD
|
#undef USE_SSSD
|
||||||
|
|
||||||
/* Define to use syslog(). */
|
|
||||||
#undef USE_SYSLOG
|
|
||||||
|
|
||||||
/* Enable extensions on AIX 3, Interix. */
|
/* Enable extensions on AIX 3, Interix. */
|
||||||
#ifndef _ALL_SOURCE
|
#ifndef _ALL_SOURCE
|
||||||
# undef _ALL_SOURCE
|
# undef _ALL_SOURCE
|
||||||
@@ -586,12 +479,12 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Define if utmpx should be used */
|
|
||||||
#undef USE_UTMPX
|
|
||||||
|
|
||||||
/* Define to allow the yescrypt password encryption algorithm */
|
/* Define to allow the yescrypt password encryption algorithm */
|
||||||
#undef USE_YESCRYPT
|
#undef USE_YESCRYPT
|
||||||
|
|
||||||
|
/* Directory for distribution provided configuration files */
|
||||||
|
#undef VENDORDIR
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#undef VERSION
|
#undef VERSION
|
||||||
|
|
||||||
@@ -607,6 +500,9 @@
|
|||||||
/* Build shadow with BtrFS support */
|
/* Build shadow with BtrFS support */
|
||||||
#undef WITH_BTRFS
|
#undef WITH_BTRFS
|
||||||
|
|
||||||
|
/* Build shadow without libbsd support */
|
||||||
|
#undef WITH_LIBBSD
|
||||||
|
|
||||||
/* Build shadow with SELinux support */
|
/* Build shadow with SELinux support */
|
||||||
#undef WITH_SELINUX
|
#undef WITH_SELINUX
|
||||||
|
|
||||||
|
|||||||
+107
-88
@@ -4,9 +4,9 @@ m4_define([libsubid_abi_major], 4)
|
|||||||
m4_define([libsubid_abi_minor], 0)
|
m4_define([libsubid_abi_minor], 0)
|
||||||
m4_define([libsubid_abi_micro], 0)
|
m4_define([libsubid_abi_micro], 0)
|
||||||
m4_define([libsubid_abi], [libsubid_abi_major.libsubid_abi_minor.libsubid_abi_micro])
|
m4_define([libsubid_abi], [libsubid_abi_major.libsubid_abi_minor.libsubid_abi_micro])
|
||||||
AC_INIT([shadow], [4.13], [pkg-shadow-devel@lists.alioth.debian.org], [],
|
AC_INIT([shadow], [4.15.3], [pkg-shadow-devel@lists.alioth.debian.org], [],
|
||||||
[https://github.com/shadow-maint/shadow])
|
[https://github.com/shadow-maint/shadow])
|
||||||
AM_INIT_AUTOMAKE([1.11 foreign dist-xz])
|
AM_INIT_AUTOMAKE([1.11 foreign dist-xz subdir-objects tar-pax])
|
||||||
AC_CONFIG_MACRO_DIRS([m4])
|
AC_CONFIG_MACRO_DIRS([m4])
|
||||||
AM_SILENT_RULES([yes])
|
AM_SILENT_RULES([yes])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
@@ -32,47 +32,30 @@ AC_PROG_CC
|
|||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
AC_PROG_YACC
|
AC_PROG_YACC
|
||||||
LT_INIT
|
LT_INIT
|
||||||
|
LT_LIB_DLLOAD
|
||||||
|
|
||||||
dnl Checks for libraries.
|
dnl Checks for libraries.
|
||||||
|
|
||||||
dnl Checks for header files.
|
dnl Checks for header files.
|
||||||
AC_HEADER_STDBOOL
|
AC_CHECK_HEADERS(crypt.h utmp.h \
|
||||||
|
termio.h sgtty.h sys/ioctl.h paths.h \
|
||||||
AC_CHECK_HEADERS(crypt.h errno.h fcntl.h limits.h unistd.h sys/time.h utmp.h \
|
sys/capability.h sys/random.h \
|
||||||
utmpx.h termios.h termio.h sgtty.h sys/ioctl.h syslog.h paths.h \
|
gshadow.h lastlog.h rpc/key_prot.h acl/libacl.h \
|
||||||
utime.h ulimit.h sys/capability.h sys/random.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)
|
attr/libattr.h attr/error_context.h)
|
||||||
|
|
||||||
dnl shadow now uses the libc's shadow implementation
|
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_HEADER([shadow.h],,[AC_MSG_ERROR([You need a libc with shadow.h])])
|
||||||
|
|
||||||
AC_CHECK_FUNCS(arc4random_buf l64a fchmod fchown fsync futimes \
|
AC_CHECK_FUNCS(arc4random_buf futimes \
|
||||||
getentropy getrandom getspnam getusershell \
|
getentropy getrandom getspnam getusershell \
|
||||||
getutent initgroups lckpwdf lutimes \
|
initgroups lckpwdf lutimes \
|
||||||
setgroups updwtmp updwtmpx innetgr getpwnam_r \
|
setgroups updwtmpx innetgr \
|
||||||
getpwuid_r getgrnam_r getgrgid_r getspnam_r \
|
getspnam_r \
|
||||||
memset_s explicit_bzero)
|
rpmatch \
|
||||||
|
memset_explicit explicit_bzero stpecpy stpeprintf)
|
||||||
AC_SYS_LARGEFILE
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
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_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,
|
AC_CHECK_MEMBERS([struct utmpx.ut_name,
|
||||||
struct utmpx.ut_host,
|
struct utmpx.ut_host,
|
||||||
@@ -82,29 +65,11 @@ AC_CHECK_MEMBERS([struct utmpx.ut_name,
|
|||||||
struct utmpx.ut_time,
|
struct utmpx.ut_time,
|
||||||
struct utmpx.ut_xtime],,,[[#include <utmpx.h>]])
|
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.
|
dnl Checks for library functions.
|
||||||
AC_TYPE_GETGROUPS
|
AC_TYPE_GETGROUPS
|
||||||
AC_FUNC_UTIME_NULL
|
AC_FUNC_UTIME_NULL
|
||||||
AC_REPLACE_FUNCS(mkdir putgrent putpwent putspent rename rmdir)
|
AC_REPLACE_FUNCS(putgrent putpwent putspent)
|
||||||
AC_REPLACE_FUNCS(sgetgrent sgetpwent sgetspent)
|
AC_REPLACE_FUNCS(sgetgrent sgetpwent sgetspent)
|
||||||
AC_REPLACE_FUNCS(snprintf strcasecmp strdup strerror strstr)
|
|
||||||
|
|
||||||
AC_CHECK_FUNC(setpgrp)
|
AC_CHECK_FUNC(setpgrp)
|
||||||
AC_CHECK_FUNC(secure_getenv, [AC_DEFINE(HAS_SECURE_GETENV,
|
AC_CHECK_FUNC(secure_getenv, [AC_DEFINE(HAS_SECURE_GETENV,
|
||||||
@@ -116,6 +81,10 @@ if test "$ac_cv_header_shadow_h" = "yes"; then
|
|||||||
ac_cv_libc_shadowgrp,
|
ac_cv_libc_shadowgrp,
|
||||||
AC_RUN_IFELSE([AC_LANG_SOURCE([
|
AC_RUN_IFELSE([AC_LANG_SOURCE([
|
||||||
#include <shadow.h>
|
#include <shadow.h>
|
||||||
|
#ifdef HAVE_GSHADOW_H
|
||||||
|
#include <gshadow.h>
|
||||||
|
#endif
|
||||||
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
struct sgrp *sg = sgetsgent("test:x::");
|
struct sgrp *sg = sgetsgent("test:x::");
|
||||||
@@ -191,7 +160,7 @@ AC_DEFINE_UNQUOTED(PASSWD_PROGRAM, "$shadow_cv_passwd_dir/passwd",
|
|||||||
[Path to passwd program.])
|
[Path to passwd program.])
|
||||||
|
|
||||||
dnl XXX - quick hack, should disappear before anyone notices :).
|
dnl XXX - quick hack, should disappear before anyone notices :).
|
||||||
AC_DEFINE(USE_SYSLOG, 1, [Define to use syslog().])
|
dnl XXX - I just read the above message :).
|
||||||
if test "$ac_cv_func_ruserok" = "yes"; then
|
if test "$ac_cv_func_ruserok" = "yes"; then
|
||||||
AC_DEFINE(RLOGIN, 1, [Define if login should support the -r flag for rlogind.])
|
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).])
|
AC_DEFINE(RUSEROK, 0, [Define to the ruserok() "success" return value (0 or 1).])
|
||||||
@@ -226,17 +195,6 @@ AC_ARG_ENABLE(account-tools-setuid,
|
|||||||
[enable_acct_tools_setuid="no"]
|
[enable_acct_tools_setuid="no"]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_ENABLE(utmpx,
|
|
||||||
[AS_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_ARG_ENABLE(subordinate-ids,
|
||||||
[AS_HELP_STRING([--enable-subordinate-ids],
|
[AS_HELP_STRING([--enable-subordinate-ids],
|
||||||
[support subordinate ids @<:@default=yes@:>@])],
|
[support subordinate ids @<:@default=yes@:>@])],
|
||||||
@@ -244,6 +202,20 @@ AC_ARG_ENABLE(subordinate-ids,
|
|||||||
[enable_subids="maybe"]
|
[enable_subids="maybe"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(lastlog,
|
||||||
|
[AS_HELP_STRING([--enable-lastlog],
|
||||||
|
[enable lastlog @<:@default=no@:>@])],
|
||||||
|
[enable_lastlog="${enableval}"],
|
||||||
|
[enable_lastlog="no"]
|
||||||
|
)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(logind,
|
||||||
|
[AS_HELP_STRING([--enable-logind],
|
||||||
|
[enable logind @<:@default=yes@:>@])],
|
||||||
|
[enable_logind="${enableval}"],
|
||||||
|
[enable_logind="yes"]
|
||||||
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(audit,
|
AC_ARG_WITH(audit,
|
||||||
[AS_HELP_STRING([--with-audit], [use auditing support @<:@default=yes if found@:>@])],
|
[AS_HELP_STRING([--with-audit], [use auditing support @<:@default=yes if found@:>@])],
|
||||||
[with_audit=$withval], [with_audit=maybe])
|
[with_audit=$withval], [with_audit=maybe])
|
||||||
@@ -268,9 +240,6 @@ AC_ARG_WITH(skey,
|
|||||||
AC_ARG_WITH(tcb,
|
AC_ARG_WITH(tcb,
|
||||||
[AS_HELP_STRING([--with-tcb], [use tcb support (incomplete) @<:@default=yes if found@:>@])],
|
[AS_HELP_STRING([--with-tcb], [use tcb support (incomplete) @<:@default=yes if found@:>@])],
|
||||||
[with_tcb=$withval], [with_tcb=maybe])
|
[with_tcb=$withval], [with_tcb=maybe])
|
||||||
AC_ARG_WITH(libcrack,
|
|
||||||
[AS_HELP_STRING([--with-libcrack], [use libcrack @<:@default=no@:>@])],
|
|
||||||
[with_libcrack=$withval], [with_libcrack=no])
|
|
||||||
AC_ARG_WITH(sha-crypt,
|
AC_ARG_WITH(sha-crypt,
|
||||||
[AS_HELP_STRING([--with-sha-crypt], [allow the SHA256 and SHA512 password encryption algorithms @<:@default=yes@:>@])],
|
[AS_HELP_STRING([--with-sha-crypt], [allow the SHA256 and SHA512 password encryption algorithms @<:@default=yes@:>@])],
|
||||||
[with_sha_crypt=$withval], [with_sha_crypt=yes])
|
[with_sha_crypt=$withval], [with_sha_crypt=yes])
|
||||||
@@ -292,6 +261,9 @@ AC_ARG_WITH(group-name-max-length,
|
|||||||
AC_ARG_WITH(su,
|
AC_ARG_WITH(su,
|
||||||
[AS_HELP_STRING([--with-su], [build and install su program and man page @<:@default=yes@:>@])],
|
[AS_HELP_STRING([--with-su], [build and install su program and man page @<:@default=yes@:>@])],
|
||||||
[with_su=$withval], [with_su=yes])
|
[with_su=$withval], [with_su=yes])
|
||||||
|
AC_ARG_WITH(libbsd,
|
||||||
|
[AS_HELP_STRING([--with-libbsd], [use libbsd support @<:@default=yes if found@:>@])],
|
||||||
|
[with_libbsd=$withval], [with_libbsd=yes])
|
||||||
|
|
||||||
if test "$with_group_name_max_length" = "no" ; then
|
if test "$with_group_name_max_length" = "no" ; then
|
||||||
with_group_name_max_length=0
|
with_group_name_max_length=0
|
||||||
@@ -302,6 +274,7 @@ AC_DEFINE_UNQUOTED(GROUP_NAME_MAX_LENGTH, $with_group_name_max_length, [max grou
|
|||||||
AC_SUBST(GROUP_NAME_MAX_LENGTH)
|
AC_SUBST(GROUP_NAME_MAX_LENGTH)
|
||||||
GROUP_NAME_MAX_LENGTH="$with_group_name_max_length"
|
GROUP_NAME_MAX_LENGTH="$with_group_name_max_length"
|
||||||
|
|
||||||
|
|
||||||
AM_CONDITIONAL(USE_SHA_CRYPT, test "x$with_sha_crypt" = "xyes")
|
AM_CONDITIONAL(USE_SHA_CRYPT, test "x$with_sha_crypt" = "xyes")
|
||||||
if test "$with_sha_crypt" = "yes"; then
|
if test "$with_sha_crypt" = "yes"; then
|
||||||
AC_DEFINE(USE_SHA_CRYPT, 1, [Define to allow the SHA256 and SHA512 password encryption algorithms])
|
AC_DEFINE(USE_SHA_CRYPT, 1, [Define to allow the SHA256 and SHA512 password encryption algorithms])
|
||||||
@@ -336,12 +309,16 @@ 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 other libraries. This should prevent linking libnsl if not really
|
||||||
dnl needed (Linux glibc, Irix), but still link it if needed (Solaris).
|
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_SEARCH_LIBS(gethostbyname, nsl)
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES([CMOCKA], [cmocka], [have_cmocka="yes"],
|
||||||
|
[AC_MSG_WARN([libcmocka not found, cmocka tests will not be built])])
|
||||||
|
AM_CONDITIONAL([HAVE_CMOCKA], [test x$have_cmocka = xyes])
|
||||||
|
|
||||||
AC_CHECK_LIB([econf],[econf_readDirs],[LIBECONF="-leconf"],[LIBECONF=""])
|
AC_CHECK_LIB([econf],[econf_readDirs],[LIBECONF="-leconf"],[LIBECONF=""])
|
||||||
if test -n "$LIBECONF"; then
|
if test -n "$LIBECONF"; then
|
||||||
|
AC_DEFINE_UNQUOTED([VENDORDIR], ["$enable_vendordir"],
|
||||||
|
[Directory for distribution provided configuration files])
|
||||||
ECONF_CPPFLAGS="-DUSE_ECONF=1"
|
ECONF_CPPFLAGS="-DUSE_ECONF=1"
|
||||||
AC_ARG_ENABLE([vendordir],
|
AC_ARG_ENABLE([vendordir],
|
||||||
AS_HELP_STRING([--enable-vendordir=DIR], [Directory for distribution provided configuration files]),,[])
|
AS_HELP_STRING([--enable-vendordir=DIR], [Directory for distribution provided configuration files]),,[])
|
||||||
@@ -349,6 +326,9 @@ fi
|
|||||||
AC_SUBST(ECONF_CPPFLAGS)
|
AC_SUBST(ECONF_CPPFLAGS)
|
||||||
AC_SUBST(LIBECONF)
|
AC_SUBST(LIBECONF)
|
||||||
AC_SUBST([VENDORDIR], [$enable_vendordir])
|
AC_SUBST([VENDORDIR], [$enable_vendordir])
|
||||||
|
if test "x$enable_vendordir" != x; then
|
||||||
|
AC_DEFINE(HAVE_VENDORDIR, 1, [Define to support vendor settings.])
|
||||||
|
fi
|
||||||
AM_CONDITIONAL([HAVE_VENDORDIR], [test "x$enable_vendordir" != x])
|
AM_CONDITIONAL([HAVE_VENDORDIR], [test "x$enable_vendordir" != x])
|
||||||
|
|
||||||
if test "$enable_shadowgrp" = "yes"; then
|
if test "$enable_shadowgrp" = "yes"; then
|
||||||
@@ -393,6 +373,39 @@ if test "$enable_subids" != "no"; then
|
|||||||
fi
|
fi
|
||||||
AM_CONDITIONAL(ENABLE_SUBIDS, test "x$enable_subids" != "xno")
|
AM_CONDITIONAL(ENABLE_SUBIDS, test "x$enable_subids" != "xno")
|
||||||
|
|
||||||
|
if test "$enable_lastlog" = "yes" && 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])
|
||||||
|
AC_DEFINE(ENABLE_LASTLOG, 1, [Define to support lastlog.])
|
||||||
|
enable_lastlog="yes"
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([Cannot enable support for lastlog on systems where the data structures aren't available])
|
||||||
|
enable_subids="no"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(ENABLE_LASTLOG, test "x$enable_lastlog" != "xno")
|
||||||
|
|
||||||
|
AC_SUBST(LIBSYSTEMD)
|
||||||
|
if test "$enable_logind" = "yes"; then
|
||||||
|
AC_CHECK_LIB(systemd, sd_session_get_remote_host,
|
||||||
|
[enable_logind="yes"; [LIBSYSTEMD=-lsystemd];
|
||||||
|
AC_DEFINE(ENABLE_LOGIND, 1,
|
||||||
|
[Define to manage session support with logind.])],
|
||||||
|
[enable_logind="no"])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(ENABLE_LOGIND, test "x$enable_logind" != "xno")
|
||||||
|
|
||||||
AC_SUBST(LIBCRYPT)
|
AC_SUBST(LIBCRYPT)
|
||||||
AC_CHECK_LIB(crypt, crypt, [LIBCRYPT=-lcrypt],
|
AC_CHECK_LIB(crypt, crypt, [LIBCRYPT=-lcrypt],
|
||||||
[AC_MSG_ERROR([crypt() not found])])
|
[AC_MSG_ERROR([crypt() not found])])
|
||||||
@@ -401,6 +414,28 @@ AC_SUBST(LIYESCRYPT)
|
|||||||
AC_CHECK_LIB(crypt, crypt, [LIYESCRYPT=-lcrypt],
|
AC_CHECK_LIB(crypt, crypt, [LIYESCRYPT=-lcrypt],
|
||||||
[AC_MSG_ERROR([crypt() not found])])
|
[AC_MSG_ERROR([crypt() not found])])
|
||||||
|
|
||||||
|
AC_SUBST(LIBBSD)
|
||||||
|
if test "$with_libbsd" != "no"; then
|
||||||
|
AC_SEARCH_LIBS([readpassphrase], [bsd], [], [
|
||||||
|
AC_MSG_ERROR([readpassphrase() is missing, either from libc or libbsd])
|
||||||
|
])
|
||||||
|
AS_IF([test "$ac_cv_search_readpassphrase" = "-lbsd"], [
|
||||||
|
PKG_CHECK_MODULES([LIBBSD], [libbsd-overlay])
|
||||||
|
])
|
||||||
|
dnl Make sure either the libc or libbsd provide the header.
|
||||||
|
save_CFLAGS="$CFLAGS"
|
||||||
|
CFLAGS="$CFLAGS $LIBBSD_CFLAGS"
|
||||||
|
AC_CHECK_HEADERS([readpassphrase.h])
|
||||||
|
AS_IF([test "$ac_cv_header_readpassphrase_h" != "yes"], [
|
||||||
|
AC_MSG_ERROR([readpassphrase.h is missing])
|
||||||
|
])
|
||||||
|
CFLAGS="$save_CFLAGS"
|
||||||
|
AC_DEFINE(WITH_LIBBSD, 1, [Build shadow with libbsd support])
|
||||||
|
else
|
||||||
|
AC_DEFINE(WITH_LIBBSD, 0, [Build shadow without libbsd support])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(WITH_LIBBSD, test x$with_libbsd = xyes)
|
||||||
|
|
||||||
AC_SUBST(LIBACL)
|
AC_SUBST(LIBACL)
|
||||||
if test "$with_acl" != "no"; then
|
if test "$with_acl" != "no"; then
|
||||||
AC_CHECK_HEADERS(acl/libacl.h attr/error_context.h, [acl_header="yes"], [acl_header="no"])
|
AC_CHECK_HEADERS(acl/libacl.h attr/error_context.h, [acl_header="yes"], [acl_header="no"])
|
||||||
@@ -485,17 +520,6 @@ if test "$with_audit" != "no"; then
|
|||||||
fi
|
fi
|
||||||
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
|
if test "$with_btrfs" != "no"; then
|
||||||
AC_CHECK_HEADERS([sys/statfs.h linux/magic.h linux/btrfs_tree.h], \
|
AC_CHECK_HEADERS([sys/statfs.h linux/magic.h linux/btrfs_tree.h], \
|
||||||
[btrfs_headers="yes"], [btrfs_headers="no"])
|
[btrfs_headers="yes"], [btrfs_headers="no"])
|
||||||
@@ -682,14 +706,7 @@ if test "$with_skey" = "yes"; then
|
|||||||
]])],[AC_DEFINE(SKEY_BSD_STYLE, 1, [Define to support newer BSD S/Key API])],[])
|
]])],[AC_DEFINE(SKEY_BSD_STYLE, 1, [Define to support newer BSD S/Key API])],[])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$enable_utmpx" = "yes"; then
|
AC_CHECK_FUNC(fgetpwent_r, [AC_DEFINE(HAVE_FGETPWENT_R, 1, [Defined to 1 if you have the declaration of 'fgetpwent_r'])])
|
||||||
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.])
|
AC_DEFINE_UNQUOTED(SHELL, ["$SHELL"], [The default shell.])
|
||||||
|
|
||||||
@@ -723,7 +740,6 @@ AC_CONFIG_FILES([
|
|||||||
man/uk/Makefile
|
man/uk/Makefile
|
||||||
man/zh_CN/Makefile
|
man/zh_CN/Makefile
|
||||||
man/zh_TW/Makefile
|
man/zh_TW/Makefile
|
||||||
libmisc/Makefile
|
|
||||||
lib/Makefile
|
lib/Makefile
|
||||||
libsubid/Makefile
|
libsubid/Makefile
|
||||||
libsubid/subid.h
|
libsubid/subid.h
|
||||||
@@ -731,7 +747,8 @@ AC_CONFIG_FILES([
|
|||||||
contrib/Makefile
|
contrib/Makefile
|
||||||
etc/Makefile
|
etc/Makefile
|
||||||
etc/pam.d/Makefile
|
etc/pam.d/Makefile
|
||||||
shadow.spec
|
etc/shadow-maint/Makefile
|
||||||
|
tests/unit/Makefile
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
@@ -739,7 +756,6 @@ echo
|
|||||||
echo "shadow will be compiled with the following features:"
|
echo "shadow will be compiled with the following features:"
|
||||||
echo
|
echo
|
||||||
echo " auditing support: $with_audit"
|
echo " auditing support: $with_audit"
|
||||||
echo " CrackLib support: $with_libcrack"
|
|
||||||
echo " PAM support: $with_libpam"
|
echo " PAM support: $with_libpam"
|
||||||
if test "$with_libpam" = "yes"; then
|
if test "$with_libpam" = "yes"; then
|
||||||
echo " suid account management tools: $enable_acct_tools_setuid"
|
echo " suid account management tools: $enable_acct_tools_setuid"
|
||||||
@@ -757,6 +773,9 @@ echo " yescrypt passwords encryption: $with_yescrypt"
|
|||||||
echo " nscd support: $with_nscd"
|
echo " nscd support: $with_nscd"
|
||||||
echo " sssd support: $with_sssd"
|
echo " sssd support: $with_sssd"
|
||||||
echo " subordinate IDs support: $enable_subids"
|
echo " subordinate IDs support: $enable_subids"
|
||||||
|
echo " enable lastlog: $enable_lastlog"
|
||||||
|
echo " enable logind: $enable_logind"
|
||||||
echo " use file caps: $with_fcaps"
|
echo " use file caps: $with_fcaps"
|
||||||
echo " install su: $with_su"
|
echo " install su: $with_su"
|
||||||
|
echo " enabled vendor dir: $enable_vendordir"
|
||||||
echo
|
echo
|
||||||
|
|||||||
+1
-3
@@ -1,6 +1,4 @@
|
|||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
# and also cooperate to make a distribution for `make dist'
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
EXTRA_DIST = README adduser.c adduser.sh adduser2.sh \
|
EXTRA_DIST = README adduser.c adduser.sh adduser2.sh
|
||||||
atudel groupmems.shar pwdauth.c shadow-anonftp.patch \
|
|
||||||
udbachk.tgz
|
|
||||||
|
|||||||
+17
-5
@@ -141,6 +141,8 @@ AWK = @AWK@
|
|||||||
CC = @CC@
|
CC = @CC@
|
||||||
CCDEPMODE = @CCDEPMODE@
|
CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
|
CMOCKA_CFLAGS = @CMOCKA_CFLAGS@
|
||||||
|
CMOCKA_LIBS = @CMOCKA_LIBS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CSCOPE = @CSCOPE@
|
CSCOPE = @CSCOPE@
|
||||||
@@ -159,6 +161,7 @@ EGREP = @EGREP@
|
|||||||
ETAGS = @ETAGS@
|
ETAGS = @ETAGS@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
FILECMD = @FILECMD@
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
||||||
GMSGFMT = @GMSGFMT@
|
GMSGFMT = @GMSGFMT@
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
GMSGFMT_015 = @GMSGFMT_015@
|
||||||
@@ -174,9 +177,15 @@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|||||||
LD = @LD@
|
LD = @LD@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBACL = @LIBACL@
|
LIBACL = @LIBACL@
|
||||||
|
LIBADD_DL = @LIBADD_DL@
|
||||||
|
LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
|
||||||
|
LIBADD_DLOPEN = @LIBADD_DLOPEN@
|
||||||
|
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
|
||||||
LIBATTR = @LIBATTR@
|
LIBATTR = @LIBATTR@
|
||||||
LIBAUDIT = @LIBAUDIT@
|
LIBAUDIT = @LIBAUDIT@
|
||||||
LIBCRACK = @LIBCRACK@
|
LIBBSD = @LIBBSD@
|
||||||
|
LIBBSD_CFLAGS = @LIBBSD_CFLAGS@
|
||||||
|
LIBBSD_LIBS = @LIBBSD_LIBS@
|
||||||
LIBCRYPT = @LIBCRYPT@
|
LIBCRYPT = @LIBCRYPT@
|
||||||
LIBECONF = @LIBECONF@
|
LIBECONF = @LIBECONF@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
@@ -192,6 +201,7 @@ LIBSUBID_ABI = @LIBSUBID_ABI@
|
|||||||
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
||||||
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
||||||
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
||||||
|
LIBSYSTEMD = @LIBSYSTEMD@
|
||||||
LIBTCB = @LIBTCB@
|
LIBTCB = @LIBTCB@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
@@ -200,6 +210,8 @@ LN_S = @LN_S@
|
|||||||
LTLIBICONV = @LTLIBICONV@
|
LTLIBICONV = @LTLIBICONV@
|
||||||
LTLIBINTL = @LTLIBINTL@
|
LTLIBINTL = @LTLIBINTL@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_DLLOADERS = @LT_DLLOADERS@
|
||||||
|
LT_DLPREOPEN = @LT_DLPREOPEN@
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
@@ -222,6 +234,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
PKG_CONFIG = @PKG_CONFIG@
|
||||||
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
POSUB = @POSUB@
|
POSUB = @POSUB@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
SED = @SED@
|
SED = @SED@
|
||||||
@@ -293,10 +308,7 @@ target_alias = @target_alias@
|
|||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
EXTRA_DIST = README adduser.c adduser.sh adduser2.sh \
|
EXTRA_DIST = README adduser.c adduser.sh adduser2.sh
|
||||||
atudel groupmems.shar pwdauth.c shadow-anonftp.patch \
|
|
||||||
udbachk.tgz
|
|
||||||
|
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|||||||
@@ -2,9 +2,6 @@ People keep sending various adduser programs and scripts... They are
|
|||||||
all in this directory. I haven't tested them, use at your own risk.
|
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.
|
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.
|
udbachk.tgz is a passwd/group/shadow file integrity checker.
|
||||||
|
|
||||||
--marekm
|
--marekm
|
||||||
|
|||||||
+2
-2
@@ -60,7 +60,7 @@
|
|||||||
** Added in the password date field, which should always reflect the last
|
** Added in the password date field, which should always reflect the last
|
||||||
** date the password was changed, for expiry purposes. "passwd" always
|
** date the password was changed, for expiry purposes. "passwd" always
|
||||||
** updates this field, so the adduser program should set it up right
|
** updates this field, so the adduser program should set it up right
|
||||||
** initially (or a user could keep thier initial password forever ;)
|
** initially (or a user could keep their initial password forever ;)
|
||||||
** The number is in days since Jan 1st, 1970.
|
** The number is in days since Jan 1st, 1970.
|
||||||
**
|
**
|
||||||
** Have fun with it, and someone please make
|
** Have fun with it, and someone please make
|
||||||
@@ -489,7 +489,7 @@ safeget (char *buf, int maxlen)
|
|||||||
while ((c = getc (stdin)) != EOF && (c != '\n') && (++i < maxlen))
|
while ((c = getc (stdin)) != EOF && (c != '\n') && (++i < maxlen))
|
||||||
{
|
{
|
||||||
bad = (!isalnum (c) && (c != '_') && (c != ' '));
|
bad = (!isalnum (c) && (c != '_') && (c != ' '));
|
||||||
*(buf++) = (char) c;
|
*(buf++) = c;
|
||||||
}
|
}
|
||||||
*buf = '\0';
|
*buf = '\0';
|
||||||
|
|
||||||
|
|||||||
@@ -1,465 +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' &&
|
|
||||||
/*
|
|
||||||
# SPDX-FileCopyrightText: 2000, International Business Machines, Inc.
|
|
||||||
# SPDX-FileCopyrightText: 2000, George Kraft IV, gk4@us.ibm.com
|
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
#
|
|
||||||
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 * SPDX-FileCopyrightText: 2000, International Business Machines, Inc.
|
|
||||||
X * SPDX-FileCopyrightText: 2000, George Kraft IV, gk4@us.ibm.com
|
|
||||||
X * SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
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.\" SPDX-FileCopyrightText: 2000, International Business Machines, Inc.
|
|
||||||
X.\" SPDX-FileCopyrightText: 2000, George Kraft IV, gk4@us.ibm.com
|
|
||||||
X.\" SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
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
-2
@@ -1,5 +1,4 @@
|
|||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
# and also cooperate to make a distribution for `make dist'
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
EXTRA_DIST = HOWTO README.limits \
|
EXTRA_DIST = HOWTO README.limits
|
||||||
README.platforms WISHLIST console.c.spec.txt cracklib26.diff
|
|
||||||
|
|||||||
+17
-4
@@ -141,6 +141,8 @@ AWK = @AWK@
|
|||||||
CC = @CC@
|
CC = @CC@
|
||||||
CCDEPMODE = @CCDEPMODE@
|
CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
|
CMOCKA_CFLAGS = @CMOCKA_CFLAGS@
|
||||||
|
CMOCKA_LIBS = @CMOCKA_LIBS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CSCOPE = @CSCOPE@
|
CSCOPE = @CSCOPE@
|
||||||
@@ -159,6 +161,7 @@ EGREP = @EGREP@
|
|||||||
ETAGS = @ETAGS@
|
ETAGS = @ETAGS@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
FILECMD = @FILECMD@
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
||||||
GMSGFMT = @GMSGFMT@
|
GMSGFMT = @GMSGFMT@
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
GMSGFMT_015 = @GMSGFMT_015@
|
||||||
@@ -174,9 +177,15 @@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|||||||
LD = @LD@
|
LD = @LD@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBACL = @LIBACL@
|
LIBACL = @LIBACL@
|
||||||
|
LIBADD_DL = @LIBADD_DL@
|
||||||
|
LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
|
||||||
|
LIBADD_DLOPEN = @LIBADD_DLOPEN@
|
||||||
|
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
|
||||||
LIBATTR = @LIBATTR@
|
LIBATTR = @LIBATTR@
|
||||||
LIBAUDIT = @LIBAUDIT@
|
LIBAUDIT = @LIBAUDIT@
|
||||||
LIBCRACK = @LIBCRACK@
|
LIBBSD = @LIBBSD@
|
||||||
|
LIBBSD_CFLAGS = @LIBBSD_CFLAGS@
|
||||||
|
LIBBSD_LIBS = @LIBBSD_LIBS@
|
||||||
LIBCRYPT = @LIBCRYPT@
|
LIBCRYPT = @LIBCRYPT@
|
||||||
LIBECONF = @LIBECONF@
|
LIBECONF = @LIBECONF@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
@@ -192,6 +201,7 @@ LIBSUBID_ABI = @LIBSUBID_ABI@
|
|||||||
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
||||||
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
||||||
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
||||||
|
LIBSYSTEMD = @LIBSYSTEMD@
|
||||||
LIBTCB = @LIBTCB@
|
LIBTCB = @LIBTCB@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
@@ -200,6 +210,8 @@ LN_S = @LN_S@
|
|||||||
LTLIBICONV = @LTLIBICONV@
|
LTLIBICONV = @LTLIBICONV@
|
||||||
LTLIBINTL = @LTLIBINTL@
|
LTLIBINTL = @LTLIBINTL@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_DLLOADERS = @LT_DLLOADERS@
|
||||||
|
LT_DLPREOPEN = @LT_DLPREOPEN@
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
@@ -222,6 +234,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
PKG_CONFIG = @PKG_CONFIG@
|
||||||
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
POSUB = @POSUB@
|
POSUB = @POSUB@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
SED = @SED@
|
SED = @SED@
|
||||||
@@ -293,9 +308,7 @@ target_alias = @target_alias@
|
|||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
EXTRA_DIST = HOWTO README.limits \
|
EXTRA_DIST = HOWTO README.limits
|
||||||
README.platforms WISHLIST console.c.spec.txt cracklib26.diff
|
|
||||||
|
|
||||||
all: all-am
|
all: all-am
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|||||||
@@ -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,39 +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
-1
@@ -20,4 +20,4 @@ EXTRA_DIST = \
|
|||||||
$(sysconf_DATA) \
|
$(sysconf_DATA) \
|
||||||
$(default_DATA)
|
$(default_DATA)
|
||||||
|
|
||||||
SUBDIRS = pam.d
|
SUBDIRS = pam.d shadow-maint
|
||||||
|
|||||||
+17
-2
@@ -230,6 +230,8 @@ AWK = @AWK@
|
|||||||
CC = @CC@
|
CC = @CC@
|
||||||
CCDEPMODE = @CCDEPMODE@
|
CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
|
CMOCKA_CFLAGS = @CMOCKA_CFLAGS@
|
||||||
|
CMOCKA_LIBS = @CMOCKA_LIBS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CSCOPE = @CSCOPE@
|
CSCOPE = @CSCOPE@
|
||||||
@@ -248,6 +250,7 @@ EGREP = @EGREP@
|
|||||||
ETAGS = @ETAGS@
|
ETAGS = @ETAGS@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
FILECMD = @FILECMD@
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
||||||
GMSGFMT = @GMSGFMT@
|
GMSGFMT = @GMSGFMT@
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
GMSGFMT_015 = @GMSGFMT_015@
|
||||||
@@ -263,9 +266,15 @@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|||||||
LD = @LD@
|
LD = @LD@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBACL = @LIBACL@
|
LIBACL = @LIBACL@
|
||||||
|
LIBADD_DL = @LIBADD_DL@
|
||||||
|
LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
|
||||||
|
LIBADD_DLOPEN = @LIBADD_DLOPEN@
|
||||||
|
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
|
||||||
LIBATTR = @LIBATTR@
|
LIBATTR = @LIBATTR@
|
||||||
LIBAUDIT = @LIBAUDIT@
|
LIBAUDIT = @LIBAUDIT@
|
||||||
LIBCRACK = @LIBCRACK@
|
LIBBSD = @LIBBSD@
|
||||||
|
LIBBSD_CFLAGS = @LIBBSD_CFLAGS@
|
||||||
|
LIBBSD_LIBS = @LIBBSD_LIBS@
|
||||||
LIBCRYPT = @LIBCRYPT@
|
LIBCRYPT = @LIBCRYPT@
|
||||||
LIBECONF = @LIBECONF@
|
LIBECONF = @LIBECONF@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
@@ -281,6 +290,7 @@ LIBSUBID_ABI = @LIBSUBID_ABI@
|
|||||||
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
||||||
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
||||||
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
||||||
|
LIBSYSTEMD = @LIBSYSTEMD@
|
||||||
LIBTCB = @LIBTCB@
|
LIBTCB = @LIBTCB@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
@@ -289,6 +299,8 @@ LN_S = @LN_S@
|
|||||||
LTLIBICONV = @LTLIBICONV@
|
LTLIBICONV = @LTLIBICONV@
|
||||||
LTLIBINTL = @LTLIBINTL@
|
LTLIBINTL = @LTLIBINTL@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_DLLOADERS = @LT_DLLOADERS@
|
||||||
|
LT_DLPREOPEN = @LT_DLPREOPEN@
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
@@ -311,6 +323,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
PKG_CONFIG = @PKG_CONFIG@
|
||||||
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
POSUB = @POSUB@
|
POSUB = @POSUB@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
SED = @SED@
|
SED = @SED@
|
||||||
@@ -396,7 +411,7 @@ EXTRA_DIST = \
|
|||||||
$(sysconf_DATA) \
|
$(sysconf_DATA) \
|
||||||
$(default_DATA)
|
$(default_DATA)
|
||||||
|
|
||||||
SUBDIRS = pam.d
|
SUBDIRS = pam.d shadow-maint
|
||||||
all: all-recursive
|
all: all-recursive
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|||||||
@@ -227,11 +227,6 @@ PASS_WARN_AGE 7
|
|||||||
#
|
#
|
||||||
SU_WHEEL_ONLY no
|
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)
|
# Min/max values for automatic uid selection in useradd(8)
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -2,20 +2,20 @@
|
|||||||
# and also cooperate to make a distribution for `make dist'
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
pamd_files = \
|
pamd_files = \
|
||||||
|
chpasswd \
|
||||||
chfn \
|
chfn \
|
||||||
chsh \
|
chsh \
|
||||||
groupmems \
|
groupmems \
|
||||||
login \
|
login \
|
||||||
|
newusers \
|
||||||
passwd
|
passwd
|
||||||
|
|
||||||
pamd_acct_tools_files = \
|
pamd_acct_tools_files = \
|
||||||
chage \
|
chage \
|
||||||
chgpasswd \
|
chgpasswd \
|
||||||
chpasswd \
|
|
||||||
groupadd \
|
groupadd \
|
||||||
groupdel \
|
groupdel \
|
||||||
groupmod \
|
groupmod \
|
||||||
newusers \
|
|
||||||
useradd \
|
useradd \
|
||||||
userdel \
|
userdel \
|
||||||
usermod
|
usermod
|
||||||
|
|||||||
+18
-4
@@ -173,6 +173,8 @@ AWK = @AWK@
|
|||||||
CC = @CC@
|
CC = @CC@
|
||||||
CCDEPMODE = @CCDEPMODE@
|
CCDEPMODE = @CCDEPMODE@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
|
CMOCKA_CFLAGS = @CMOCKA_CFLAGS@
|
||||||
|
CMOCKA_LIBS = @CMOCKA_LIBS@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
CSCOPE = @CSCOPE@
|
CSCOPE = @CSCOPE@
|
||||||
@@ -191,6 +193,7 @@ EGREP = @EGREP@
|
|||||||
ETAGS = @ETAGS@
|
ETAGS = @ETAGS@
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
FGREP = @FGREP@
|
FGREP = @FGREP@
|
||||||
|
FILECMD = @FILECMD@
|
||||||
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
|
||||||
GMSGFMT = @GMSGFMT@
|
GMSGFMT = @GMSGFMT@
|
||||||
GMSGFMT_015 = @GMSGFMT_015@
|
GMSGFMT_015 = @GMSGFMT_015@
|
||||||
@@ -206,9 +209,15 @@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
|
|||||||
LD = @LD@
|
LD = @LD@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBACL = @LIBACL@
|
LIBACL = @LIBACL@
|
||||||
|
LIBADD_DL = @LIBADD_DL@
|
||||||
|
LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
|
||||||
|
LIBADD_DLOPEN = @LIBADD_DLOPEN@
|
||||||
|
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
|
||||||
LIBATTR = @LIBATTR@
|
LIBATTR = @LIBATTR@
|
||||||
LIBAUDIT = @LIBAUDIT@
|
LIBAUDIT = @LIBAUDIT@
|
||||||
LIBCRACK = @LIBCRACK@
|
LIBBSD = @LIBBSD@
|
||||||
|
LIBBSD_CFLAGS = @LIBBSD_CFLAGS@
|
||||||
|
LIBBSD_LIBS = @LIBBSD_LIBS@
|
||||||
LIBCRYPT = @LIBCRYPT@
|
LIBCRYPT = @LIBCRYPT@
|
||||||
LIBECONF = @LIBECONF@
|
LIBECONF = @LIBECONF@
|
||||||
LIBICONV = @LIBICONV@
|
LIBICONV = @LIBICONV@
|
||||||
@@ -224,6 +233,7 @@ LIBSUBID_ABI = @LIBSUBID_ABI@
|
|||||||
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
||||||
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
||||||
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
||||||
|
LIBSYSTEMD = @LIBSYSTEMD@
|
||||||
LIBTCB = @LIBTCB@
|
LIBTCB = @LIBTCB@
|
||||||
LIBTOOL = @LIBTOOL@
|
LIBTOOL = @LIBTOOL@
|
||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
@@ -232,6 +242,8 @@ LN_S = @LN_S@
|
|||||||
LTLIBICONV = @LTLIBICONV@
|
LTLIBICONV = @LTLIBICONV@
|
||||||
LTLIBINTL = @LTLIBINTL@
|
LTLIBINTL = @LTLIBINTL@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_DLLOADERS = @LT_DLLOADERS@
|
||||||
|
LT_DLPREOPEN = @LT_DLPREOPEN@
|
||||||
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAINT = @MAINT@
|
MAINT = @MAINT@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
@@ -254,6 +266,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|||||||
PACKAGE_URL = @PACKAGE_URL@
|
PACKAGE_URL = @PACKAGE_URL@
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||||
|
PKG_CONFIG = @PKG_CONFIG@
|
||||||
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
POSUB = @POSUB@
|
POSUB = @POSUB@
|
||||||
RANLIB = @RANLIB@
|
RANLIB = @RANLIB@
|
||||||
SED = @SED@
|
SED = @SED@
|
||||||
@@ -325,15 +340,14 @@ target_alias = @target_alias@
|
|||||||
top_build_prefix = @top_build_prefix@
|
top_build_prefix = @top_build_prefix@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
pamd_files = chfn chsh groupmems login passwd $(am__append_2)
|
pamd_files = chpasswd chfn chsh groupmems login newusers passwd \
|
||||||
|
$(am__append_2)
|
||||||
pamd_acct_tools_files = \
|
pamd_acct_tools_files = \
|
||||||
chage \
|
chage \
|
||||||
chgpasswd \
|
chgpasswd \
|
||||||
chpasswd \
|
|
||||||
groupadd \
|
groupadd \
|
||||||
groupdel \
|
groupdel \
|
||||||
groupmod \
|
groupmod \
|
||||||
newusers \
|
|
||||||
useradd \
|
useradd \
|
||||||
userdel \
|
userdel \
|
||||||
usermod
|
usermod
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
shadowmaint_files = \
|
||||||
|
groupdel-pre.d/01-kill_group_procs.sh \
|
||||||
|
userdel-pre.d/01-kill_user_procs.sh
|
||||||
|
|
||||||
|
EXTRA_DIST = $(shadowmaint_files)
|
||||||
@@ -0,0 +1,509 @@
|
|||||||
|
# Makefile.in generated by automake 1.16.5 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2021 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
am__is_gnu_make = { \
|
||||||
|
if test -z '$(MAKELEVEL)'; then \
|
||||||
|
false; \
|
||||||
|
elif test -n '$(MAKE_HOST)'; then \
|
||||||
|
true; \
|
||||||
|
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||||
|
true; \
|
||||||
|
else \
|
||||||
|
false; \
|
||||||
|
fi; \
|
||||||
|
}
|
||||||
|
am__make_running_with_option = \
|
||||||
|
case $${target_option-} in \
|
||||||
|
?) ;; \
|
||||||
|
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||||
|
"target option '$${target_option-}' specified" >&2; \
|
||||||
|
exit 1;; \
|
||||||
|
esac; \
|
||||||
|
has_opt=no; \
|
||||||
|
sane_makeflags=$$MAKEFLAGS; \
|
||||||
|
if $(am__is_gnu_make); then \
|
||||||
|
sane_makeflags=$$MFLAGS; \
|
||||||
|
else \
|
||||||
|
case $$MAKEFLAGS in \
|
||||||
|
*\\[\ \ ]*) \
|
||||||
|
bs=\\; \
|
||||||
|
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||||
|
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||||
|
esac; \
|
||||||
|
fi; \
|
||||||
|
skip_next=no; \
|
||||||
|
strip_trailopt () \
|
||||||
|
{ \
|
||||||
|
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||||
|
}; \
|
||||||
|
for flg in $$sane_makeflags; do \
|
||||||
|
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||||
|
case $$flg in \
|
||||||
|
*=*|--*) continue;; \
|
||||||
|
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||||
|
-*I?*) strip_trailopt 'I';; \
|
||||||
|
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||||
|
-*O?*) strip_trailopt 'O';; \
|
||||||
|
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||||
|
-*l?*) strip_trailopt 'l';; \
|
||||||
|
-[dEDm]) skip_next=yes;; \
|
||||||
|
-[JT]) skip_next=yes;; \
|
||||||
|
esac; \
|
||||||
|
case $$flg in \
|
||||||
|
*$$target_option*) has_opt=yes; break;; \
|
||||||
|
esac; \
|
||||||
|
done; \
|
||||||
|
test $$has_opt = yes
|
||||||
|
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||||
|
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||||
|
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||||
|
install_sh_DATA = $(install_sh) -c -m 644
|
||||||
|
install_sh_PROGRAM = $(install_sh) -c
|
||||||
|
install_sh_SCRIPT = $(install_sh) -c
|
||||||
|
INSTALL_HEADER = $(INSTALL_DATA)
|
||||||
|
transform = $(program_transform_name)
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
build_triplet = @build@
|
||||||
|
host_triplet = @host@
|
||||||
|
subdir = etc/shadow-maint
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
|
||||||
|
$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
|
||||||
|
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
|
||||||
|
$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
|
||||||
|
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
|
||||||
|
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
|
||||||
|
$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
|
||||||
|
$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \
|
||||||
|
$(top_srcdir)/configure.ac
|
||||||
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
|
||||||
|
mkinstalldirs = $(install_sh) -d
|
||||||
|
CONFIG_HEADER = $(top_builddir)/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@
|
||||||
|
CMOCKA_CFLAGS = @CMOCKA_CFLAGS@
|
||||||
|
CMOCKA_LIBS = @CMOCKA_LIBS@
|
||||||
|
CPP = @CPP@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CSCOPE = @CSCOPE@
|
||||||
|
CTAGS = @CTAGS@
|
||||||
|
CYGPATH_W = @CYGPATH_W@
|
||||||
|
DEFS = @DEFS@
|
||||||
|
DEPDIR = @DEPDIR@
|
||||||
|
DLLTOOL = @DLLTOOL@
|
||||||
|
DSYMUTIL = @DSYMUTIL@
|
||||||
|
DUMPBIN = @DUMPBIN@
|
||||||
|
ECHO_C = @ECHO_C@
|
||||||
|
ECHO_N = @ECHO_N@
|
||||||
|
ECHO_T = @ECHO_T@
|
||||||
|
ECONF_CPPFLAGS = @ECONF_CPPFLAGS@
|
||||||
|
EGREP = @EGREP@
|
||||||
|
ETAGS = @ETAGS@
|
||||||
|
EXEEXT = @EXEEXT@
|
||||||
|
FGREP = @FGREP@
|
||||||
|
FILECMD = @FILECMD@
|
||||||
|
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@
|
||||||
|
LIBADD_DL = @LIBADD_DL@
|
||||||
|
LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
|
||||||
|
LIBADD_DLOPEN = @LIBADD_DLOPEN@
|
||||||
|
LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
|
||||||
|
LIBATTR = @LIBATTR@
|
||||||
|
LIBAUDIT = @LIBAUDIT@
|
||||||
|
LIBBSD = @LIBBSD@
|
||||||
|
LIBBSD_CFLAGS = @LIBBSD_CFLAGS@
|
||||||
|
LIBBSD_LIBS = @LIBBSD_LIBS@
|
||||||
|
LIBCRYPT = @LIBCRYPT@
|
||||||
|
LIBECONF = @LIBECONF@
|
||||||
|
LIBICONV = @LIBICONV@
|
||||||
|
LIBINTL = @LIBINTL@
|
||||||
|
LIBMD = @LIBMD@
|
||||||
|
LIBOBJS = @LIBOBJS@
|
||||||
|
LIBPAM = @LIBPAM@
|
||||||
|
LIBS = @LIBS@
|
||||||
|
LIBSELINUX = @LIBSELINUX@
|
||||||
|
LIBSEMANAGE = @LIBSEMANAGE@
|
||||||
|
LIBSKEY = @LIBSKEY@
|
||||||
|
LIBSUBID_ABI = @LIBSUBID_ABI@
|
||||||
|
LIBSUBID_ABI_MAJOR = @LIBSUBID_ABI_MAJOR@
|
||||||
|
LIBSUBID_ABI_MICRO = @LIBSUBID_ABI_MICRO@
|
||||||
|
LIBSUBID_ABI_MINOR = @LIBSUBID_ABI_MINOR@
|
||||||
|
LIBSYSTEMD = @LIBSYSTEMD@
|
||||||
|
LIBTCB = @LIBTCB@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LIPO = @LIPO@
|
||||||
|
LIYESCRYPT = @LIYESCRYPT@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBICONV = @LTLIBICONV@
|
||||||
|
LTLIBINTL = @LTLIBINTL@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_DLLOADERS = @LT_DLLOADERS@
|
||||||
|
LT_DLPREOPEN = @LT_DLPREOPEN@
|
||||||
|
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@
|
||||||
|
PKG_CONFIG = @PKG_CONFIG@
|
||||||
|
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||||
|
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||||
|
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@
|
||||||
|
shadowmaint_files = \
|
||||||
|
groupdel-pre.d/01-kill_group_procs.sh \
|
||||||
|
userdel-pre.d/01-kill_user_procs.sh
|
||||||
|
|
||||||
|
EXTRA_DIST = $(shadowmaint_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/shadow-maint/Makefile'; \
|
||||||
|
$(am__cd) $(top_srcdir) && \
|
||||||
|
$(AUTOMAKE) --foreign etc/shadow-maint/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:
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
GROUPID=`awk -F: '$1 == "'"${SUBJECT}"'" { print $3 }' /etc/group`
|
||||||
|
|
||||||
|
if [ "${GROUPID}" = "" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
for status in /proc/*/status; do
|
||||||
|
# either this isn't a process or its already dead since expanding the list
|
||||||
|
[ -f "$status" ] || continue
|
||||||
|
|
||||||
|
tbuf=${status%/status}
|
||||||
|
pid=${tbuf#/proc/}
|
||||||
|
case "$pid" in
|
||||||
|
"$$") continue;;
|
||||||
|
[0-9]*) :;;
|
||||||
|
*) continue
|
||||||
|
esac
|
||||||
|
|
||||||
|
grep -q '^Groups:.*\b'"${GROUPID}"'\b.*' "/proc/$pid/status" || continue
|
||||||
|
|
||||||
|
kill -9 "$pid" || echo "cannot kill $pid" 1>&2
|
||||||
|
done
|
||||||
|
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
|
||||||
|
# Check user exists, and if so, send sigkill to processes that the user owns
|
||||||
|
|
||||||
|
ps -eo user >/dev/null 2>&1
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
RUNNING=`ps -eo user | grep -Fx "$SUBJECT" | wc -l`
|
||||||
|
# if the user does not exist, RUNNING will be 0
|
||||||
|
if [ "${RUNNING}x" = "0x" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If there is no ps -eo, traverse the process directly.
|
||||||
|
|
||||||
|
ls -1 /proc | while IFS= read -r PROC; do
|
||||||
|
echo "$PROC" | grep -E '^[0-9]+$' >/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [ -d "/proc/${PROC}" ]; then
|
||||||
|
USR=`stat -c "%U" /proc/${PROC}`
|
||||||
|
if [ "${USR}" = "${SUBJECT}" ]; then
|
||||||
|
echo "Killing ${SUBJECT} owned ${PROC}"
|
||||||
|
kill -9 "${PROC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
+146
-13
@@ -5,57 +5,129 @@ DEFS =
|
|||||||
|
|
||||||
noinst_LTLIBRARIES = libshadow.la
|
noinst_LTLIBRARIES = libshadow.la
|
||||||
|
|
||||||
|
if USE_PAM
|
||||||
|
LIBCRYPT_PAM = $(LIBCRYPT)
|
||||||
|
else
|
||||||
|
LIBCRYPT_PAM =
|
||||||
|
endif
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(top_srcdir)/lib -I$(top_srcdir) $(ECONF_CPPFLAGS)
|
||||||
|
|
||||||
libshadow_la_CPPFLAGS = $(ECONF_CPPFLAGS)
|
libshadow_la_CPPFLAGS = $(ECONF_CPPFLAGS)
|
||||||
if HAVE_VENDORDIR
|
if HAVE_VENDORDIR
|
||||||
libshadow_la_CPPFLAGS += -DVENDORDIR=\"$(VENDORDIR)\"
|
libshadow_la_CPPFLAGS += -DVENDORDIR=\"$(VENDORDIR)\"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
libshadow_la_CPPFLAGS += -I$(top_srcdir)
|
libshadow_la_CPPFLAGS += -I$(top_srcdir)
|
||||||
|
libshadow_la_CFLAGS = $(LIBBSD_CFLAGS) $(LIBCRYPT_PAM) $(LIBSYSTEMD)
|
||||||
|
libshadow_la_LIBADD = $(LIBADD_DLOPEN)
|
||||||
|
|
||||||
libshadow_la_SOURCES = \
|
libshadow_la_SOURCES = \
|
||||||
|
addgrps.c \
|
||||||
|
adds.c \
|
||||||
|
adds.h \
|
||||||
|
age.c \
|
||||||
|
agetpass.c \
|
||||||
|
agetpass.h \
|
||||||
|
alloc.c \
|
||||||
|
alloc.h \
|
||||||
|
atoi/a2i.c \
|
||||||
|
atoi/a2i.h \
|
||||||
|
atoi/str2i.c \
|
||||||
|
atoi/str2i.h \
|
||||||
|
atoi/strtoi.c \
|
||||||
|
atoi/strtoi.h \
|
||||||
|
atoi/strtou_noneg.c \
|
||||||
|
atoi/strtou_noneg.h \
|
||||||
|
attr.h \
|
||||||
|
audit_help.c \
|
||||||
|
basename.c \
|
||||||
|
bit.c \
|
||||||
|
bit.h \
|
||||||
|
cast.h \
|
||||||
|
chkname.c \
|
||||||
|
chkname.h \
|
||||||
|
chowndir.c \
|
||||||
|
chowntty.c \
|
||||||
|
cleanup.c \
|
||||||
|
cleanup_group.c \
|
||||||
|
cleanup_user.c \
|
||||||
commonio.c \
|
commonio.c \
|
||||||
commonio.h \
|
commonio.h \
|
||||||
|
console.c \
|
||||||
|
copydir.c \
|
||||||
|
csrand.c \
|
||||||
defines.h \
|
defines.h \
|
||||||
encrypt.c \
|
encrypt.c \
|
||||||
|
env.c \
|
||||||
exitcodes.h \
|
exitcodes.h \
|
||||||
faillog.h \
|
faillog.h \
|
||||||
|
failure.c \
|
||||||
|
failure.h \
|
||||||
|
fd.c \
|
||||||
fields.c \
|
fields.c \
|
||||||
|
find_new_gid.c \
|
||||||
|
find_new_uid.c \
|
||||||
|
find_new_sub_gids.c \
|
||||||
|
find_new_sub_uids.c \
|
||||||
fputsx.c \
|
fputsx.c \
|
||||||
getdef.c \
|
|
||||||
getdef.h \
|
|
||||||
get_gid.c \
|
get_gid.c \
|
||||||
getlong.c \
|
|
||||||
get_pid.c \
|
get_pid.c \
|
||||||
get_uid.c \
|
get_uid.c \
|
||||||
getulong.c \
|
getdate.h \
|
||||||
|
getdate.y \
|
||||||
|
getdef.c \
|
||||||
|
getdef.h \
|
||||||
|
getgr_nam_gid.c \
|
||||||
|
getrange.c \
|
||||||
|
gettime.c \
|
||||||
groupio.c \
|
groupio.c \
|
||||||
groupmem.c \
|
groupmem.c \
|
||||||
groupio.h \
|
groupio.h \
|
||||||
gshadow.c \
|
gshadow.c \
|
||||||
|
hushed.c \
|
||||||
|
idmapping.h \
|
||||||
|
idmapping.c \
|
||||||
|
isexpired.c \
|
||||||
|
limits.c \
|
||||||
|
list.c \
|
||||||
lockpw.c \
|
lockpw.c \
|
||||||
|
loginprompt.c \
|
||||||
|
mail.c \
|
||||||
|
memzero.c \
|
||||||
|
memzero.h \
|
||||||
|
motd.c \
|
||||||
|
must_be.h \
|
||||||
|
myname.c \
|
||||||
nss.c \
|
nss.c \
|
||||||
nscd.c \
|
nscd.c \
|
||||||
nscd.h \
|
nscd.h \
|
||||||
shadowlog.c \
|
obscure.c \
|
||||||
shadowlog.h \
|
|
||||||
shadowlog_internal.h \
|
|
||||||
sssd.c \
|
|
||||||
sssd.h \
|
|
||||||
pam_defs.h \
|
pam_defs.h \
|
||||||
|
pam_pass.c \
|
||||||
|
pam_pass_non_interactive.c \
|
||||||
port.c \
|
port.c \
|
||||||
port.h \
|
port.h \
|
||||||
|
prefix_flag.c \
|
||||||
prototypes.h \
|
prototypes.h \
|
||||||
pwauth.c \
|
pwauth.c \
|
||||||
pwauth.h \
|
pwauth.h \
|
||||||
pwio.c \
|
pwio.c \
|
||||||
pwio.h \
|
pwio.h \
|
||||||
|
pwd_init.c \
|
||||||
|
pwd2spwd.c \
|
||||||
|
pwdcheck.c \
|
||||||
pwmem.c \
|
pwmem.c \
|
||||||
|
remove_tree.c \
|
||||||
|
rlogin.c \
|
||||||
|
root_flag.c \
|
||||||
run_part.h \
|
run_part.h \
|
||||||
run_part.c \
|
run_part.c \
|
||||||
subordinateio.h \
|
salt.c \
|
||||||
subordinateio.c \
|
|
||||||
selinux.c \
|
selinux.c \
|
||||||
semanage.c \
|
semanage.c \
|
||||||
|
setugid.c \
|
||||||
|
setupenv.c \
|
||||||
sgetgrent.c \
|
sgetgrent.c \
|
||||||
sgetpwent.c \
|
sgetpwent.c \
|
||||||
sgetspent.c \
|
sgetspent.c \
|
||||||
@@ -64,14 +136,74 @@ libshadow_la_SOURCES = \
|
|||||||
shadow.c \
|
shadow.c \
|
||||||
shadowio.c \
|
shadowio.c \
|
||||||
shadowio.h \
|
shadowio.h \
|
||||||
|
shadowlog.c \
|
||||||
|
shadowlog.h \
|
||||||
|
shadowlog_internal.h \
|
||||||
shadowmem.c \
|
shadowmem.c \
|
||||||
|
shell.c \
|
||||||
|
sizeof.h \
|
||||||
spawn.c \
|
spawn.c \
|
||||||
utent.c
|
sssd.c \
|
||||||
|
sssd.h \
|
||||||
|
string/sprintf.c \
|
||||||
|
string/sprintf.h \
|
||||||
|
string/stpecpy.c \
|
||||||
|
string/stpecpy.h \
|
||||||
|
string/stpeprintf.c \
|
||||||
|
string/stpeprintf.h \
|
||||||
|
string/strftime.c \
|
||||||
|
string/strftime.h \
|
||||||
|
string/strncpy.h \
|
||||||
|
string/strtcpy.c \
|
||||||
|
string/strtcpy.h \
|
||||||
|
string/zustr2stp.h \
|
||||||
|
strtoday.c \
|
||||||
|
sub.c \
|
||||||
|
subordinateio.h \
|
||||||
|
subordinateio.c \
|
||||||
|
sulog.c \
|
||||||
|
time/day_to_str.c \
|
||||||
|
time/day_to_str.h \
|
||||||
|
ttytype.c \
|
||||||
|
tz.c \
|
||||||
|
ulimit.c \
|
||||||
|
user_busy.c \
|
||||||
|
valid.c \
|
||||||
|
write_full.c \
|
||||||
|
xgetpwnam.c \
|
||||||
|
xprefix_getpwnam.c \
|
||||||
|
xgetpwuid.c \
|
||||||
|
xgetgrnam.c \
|
||||||
|
xgetgrgid.c \
|
||||||
|
xgetspnam.c \
|
||||||
|
yesno.c
|
||||||
|
|
||||||
if WITH_TCB
|
if WITH_TCB
|
||||||
libshadow_la_SOURCES += tcbfuncs.c tcbfuncs.h
|
libshadow_la_SOURCES += tcbfuncs.c tcbfuncs.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if WITH_BTRFS
|
||||||
|
libshadow_la_SOURCES += btrfs.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
if ENABLE_LASTLOG
|
||||||
|
libshadow_la_SOURCES += log.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
if ENABLE_LOGIND
|
||||||
|
libshadow_la_SOURCES += logind.c
|
||||||
|
else
|
||||||
|
libshadow_la_SOURCES += utmp.c
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !WITH_LIBBSD
|
||||||
|
libshadow_la_SOURCES += \
|
||||||
|
freezero.h \
|
||||||
|
freezero.c \
|
||||||
|
readpassphrase.h \
|
||||||
|
readpassphrase.c
|
||||||
|
endif
|
||||||
|
|
||||||
# These files are unneeded for some reason, listed in
|
# These files are unneeded for some reason, listed in
|
||||||
# order of appearance:
|
# order of appearance:
|
||||||
#
|
#
|
||||||
@@ -79,4 +211,5 @@ endif
|
|||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
.indent.pro \
|
.indent.pro \
|
||||||
gshadow_.h
|
gshadow_.h \
|
||||||
|
xgetXXbyYY.c
|
||||||
|
|||||||
+1253
-161
File diff suppressed because it is too large
Load Diff
@@ -17,6 +17,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
#include "shadowlog.h"
|
#include "shadowlog.h"
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
@@ -29,7 +31,7 @@
|
|||||||
*/
|
*/
|
||||||
int add_groups (const char *list)
|
int add_groups (const char *list)
|
||||||
{
|
{
|
||||||
GETGROUPS_T *grouplist, *tmp;
|
GETGROUPS_T *grouplist;
|
||||||
size_t i;
|
size_t i;
|
||||||
int ngroups;
|
int ngroups;
|
||||||
bool added;
|
bool added;
|
||||||
@@ -46,7 +48,7 @@ int add_groups (const char *list)
|
|||||||
|
|
||||||
i = 16;
|
i = 16;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
grouplist = (gid_t *) malloc (i * sizeof (GETGROUPS_T));
|
grouplist = MALLOC(i, GETGROUPS_T);
|
||||||
if (NULL == grouplist) {
|
if (NULL == grouplist) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -88,19 +90,17 @@ int add_groups (const char *list)
|
|||||||
fputs (_("Warning: too many groups\n"), shadow_logfd);
|
fputs (_("Warning: too many groups\n"), shadow_logfd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tmp = (gid_t *) realloc (grouplist, (size_t)(ngroups + 1) * sizeof (GETGROUPS_T));
|
grouplist = REALLOCF(grouplist, (size_t) ngroups + 1, GETGROUPS_T);
|
||||||
if (NULL == tmp) {
|
if (grouplist == NULL) {
|
||||||
free (grouplist);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tmp[ngroups] = grp->gr_gid;
|
grouplist[ngroups] = grp->gr_gid;
|
||||||
ngroups++;
|
ngroups++;
|
||||||
grouplist = tmp;
|
|
||||||
added = true;
|
added = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (added) {
|
if (added) {
|
||||||
ret = setgroups ((size_t)ngroups, grouplist);
|
ret = setgroups (ngroups, grouplist);
|
||||||
free (grouplist);
|
free (grouplist);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -109,6 +109,6 @@ int add_groups (const char *list)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else /* HAVE_SETGROUPS && !USE_PAM */
|
#else /* HAVE_SETGROUPS && !USE_PAM */
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
extern int ISO_C_forbids_an_empty_translation_unit;
|
||||||
#endif /* HAVE_SETGROUPS && !USE_PAM */
|
#endif /* HAVE_SETGROUPS && !USE_PAM */
|
||||||
|
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "adds.h"
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern inline long addsl2(long a, long b);
|
||||||
|
extern inline long addslN(size_t n, long addend[n]);
|
||||||
|
|
||||||
|
extern inline int cmpl(const void *p1, const void *p2);
|
||||||
+86
@@ -0,0 +1,86 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_ADDS_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_ADDS_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "sizeof.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define addsl(a, b, ...) \
|
||||||
|
({ \
|
||||||
|
long addend_[] = {a, b, __VA_ARGS__}; \
|
||||||
|
\
|
||||||
|
addslN(NITEMS(addend_), addend_); \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
inline long addsl2(long a, long b);
|
||||||
|
inline long addslN(size_t n, long addend[n]);
|
||||||
|
|
||||||
|
inline int cmpl(const void *p1, const void *p2);
|
||||||
|
|
||||||
|
|
||||||
|
inline long
|
||||||
|
addsl2(long a, long b)
|
||||||
|
{
|
||||||
|
if (a > 0 && b > LONG_MAX - a) {
|
||||||
|
errno = EOVERFLOW;
|
||||||
|
return LONG_MAX;
|
||||||
|
}
|
||||||
|
if (a < 0 && b < LONG_MIN - a) {
|
||||||
|
errno = EOVERFLOW;
|
||||||
|
return LONG_MIN;
|
||||||
|
}
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline long
|
||||||
|
addslN(size_t n, long addend[n])
|
||||||
|
{
|
||||||
|
int e;
|
||||||
|
|
||||||
|
if (n == 0) {
|
||||||
|
errno = EDOM;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
e = errno;
|
||||||
|
while (n > 1) {
|
||||||
|
qsort(addend, n, sizeof(addend[0]), cmpl);
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
addend[0] = addsl2(addend[0], addend[--n]);
|
||||||
|
if (errno == EOVERFLOW)
|
||||||
|
return addend[0];
|
||||||
|
}
|
||||||
|
errno = e;
|
||||||
|
return addend[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
cmpl(const void *p1, const void *p2)
|
||||||
|
{
|
||||||
|
const long *l1 = p1;
|
||||||
|
const long *l2 = p2;
|
||||||
|
|
||||||
|
if (*l1 < *l2)
|
||||||
|
return -1;
|
||||||
|
if (*l1 > *l2)
|
||||||
|
return +1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -13,12 +13,15 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "prototypes.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "exitcodes.h"
|
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
|
|
||||||
|
#include "adds.h"
|
||||||
|
#include "defines.h"
|
||||||
|
#include "exitcodes.h"
|
||||||
|
#include "prototypes.h"
|
||||||
|
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
#ifndef PASSWD_PROGRAM
|
#ifndef PASSWD_PROGRAM
|
||||||
@@ -112,7 +115,7 @@ int expire (const struct passwd *pw, /*@null@*/const struct spwd *sp)
|
|||||||
_exit (126);
|
_exit (126);
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) execl (PASSWD_PROGRAM, PASSWD_PROGRAM, pw->pw_name, (char *) 0);
|
(void) execl (PASSWD_PROGRAM, PASSWD_PROGRAM, pw->pw_name, (char *) NULL);
|
||||||
err = errno;
|
err = errno;
|
||||||
perror ("Can't execute " PASSWD_PROGRAM);
|
perror ("Can't execute " PASSWD_PROGRAM);
|
||||||
_exit ((ENOENT == err) ? E_CMD_NOTFOUND : E_CMD_NOEXEC);
|
_exit ((ENOENT == err) ? E_CMD_NOTFOUND : E_CMD_NOEXEC);
|
||||||
@@ -139,7 +142,7 @@ int expire (const struct passwd *pw, /*@null@*/const struct spwd *sp)
|
|||||||
|
|
||||||
void agecheck (/*@null@*/const struct spwd *sp)
|
void agecheck (/*@null@*/const struct spwd *sp)
|
||||||
{
|
{
|
||||||
long now = (long) time ((time_t *) 0) / SCALE;
|
long now = time(NULL) / DAY;
|
||||||
long remain;
|
long remain;
|
||||||
|
|
||||||
if (NULL == sp) {
|
if (NULL == sp) {
|
||||||
@@ -162,9 +165,9 @@ void agecheck (/*@null@*/const struct spwd *sp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
remain = sp->sp_lstchg + sp->sp_max - now;
|
remain = addsl(sp->sp_lstchg, sp->sp_max, -now);
|
||||||
|
|
||||||
if (remain <= sp->sp_warn) {
|
if (remain <= sp->sp_warn) {
|
||||||
remain /= DAY / SCALE;
|
|
||||||
if (remain > 1) {
|
if (remain > 1) {
|
||||||
(void) printf (_("Your password will expire in %ld days.\n"),
|
(void) printf (_("Your password will expire in %ld days.\n"),
|
||||||
remain);
|
remain);
|
||||||
+145
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2022, Alejandro Colomar <alx@kernel.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "agetpass.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <readpassphrase.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ident "$Id$"
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
|
|
||||||
|
#if WITH_LIBBSD == 0
|
||||||
|
#include "freezero.h"
|
||||||
|
#endif /* WITH_LIBBSD */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* SYNOPSIS
|
||||||
|
* [[gnu::malloc(erase_pass)]]
|
||||||
|
* char *agetpass(const char *prompt);
|
||||||
|
* char *agetpass_stdin();
|
||||||
|
*
|
||||||
|
* void erase_pass(char *pass);
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* agetpass()
|
||||||
|
* prompt String to be printed before reading a password.
|
||||||
|
*
|
||||||
|
* erase_pass()
|
||||||
|
* pass password previously returned by agetpass().
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* agetpass()
|
||||||
|
* This function is very similar to getpass(3). It has several
|
||||||
|
* advantages compared to getpass(3):
|
||||||
|
*
|
||||||
|
* - Instead of using a static buffer, agetpass() allocates memory
|
||||||
|
* through malloc(3). This makes the function thread-safe, and
|
||||||
|
* also reduces the visibility of the buffer.
|
||||||
|
*
|
||||||
|
* - agetpass() doesn't reallocate internally. Some
|
||||||
|
* implementations of getpass(3), such as glibc, do that, as a
|
||||||
|
* consequence of calling getline(3). That's a bug in glibc,
|
||||||
|
* which allows leaking prefixes of passwords in freed memory.
|
||||||
|
*
|
||||||
|
* - agetpass() doesn't overrun the output buffer. If the input
|
||||||
|
* password is too long, it simply fails. Some implementations
|
||||||
|
* of getpass(3), share the same bug that gets(3) has.
|
||||||
|
*
|
||||||
|
* As soon as possible, the password obtained from agetpass() be
|
||||||
|
* erased by calling erase_pass(), to avoid possibly leaking the
|
||||||
|
* password.
|
||||||
|
*
|
||||||
|
* agetpass_stdin()
|
||||||
|
* This function is the same as previous one (agetpass). Just the
|
||||||
|
* password is read from stdin and terminal is not required.
|
||||||
|
*
|
||||||
|
* erase_pass()
|
||||||
|
* This function first clears the password, by calling
|
||||||
|
* explicit_bzero(3) (or an equivalent call), and then frees the
|
||||||
|
* allocated memory by calling free(3).
|
||||||
|
*
|
||||||
|
* NULL is a valid input pointer, and in such a case, this call is
|
||||||
|
* a no-op.
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* agetpass() returns a newly allocated buffer containing the
|
||||||
|
* password on success. On error, errno is set to indicate the
|
||||||
|
* error, and NULL is returned.
|
||||||
|
*
|
||||||
|
* ERRORS
|
||||||
|
* agetpass()
|
||||||
|
* This function may fail for any errors that malloc(3) or
|
||||||
|
* readpassphrase(3) may fail, and in addition it may fail for the
|
||||||
|
* following errors:
|
||||||
|
*
|
||||||
|
* ENOBUFS
|
||||||
|
* The input password was longer than PASS_MAX.
|
||||||
|
*
|
||||||
|
* CAVEATS
|
||||||
|
* If a password is passed twice to erase_pass(), the behavior is
|
||||||
|
* undefined.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
agetpass_internal(const char *prompt, int flags)
|
||||||
|
{
|
||||||
|
char *pass;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Since we want to support passwords upto PASS_MAX, we need
|
||||||
|
* PASS_MAX bytes for the password itself, and one more byte for
|
||||||
|
* the terminating '\0'. We also want to detect truncation, and
|
||||||
|
* readpassphrase(3) doesn't detect it, so we need some trick.
|
||||||
|
* Let's add one more byte, and if the password uses it, it
|
||||||
|
* means the introduced password was longer than PASS_MAX.
|
||||||
|
*/
|
||||||
|
pass = MALLOC(PASS_MAX + 2, char);
|
||||||
|
if (pass == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (readpassphrase(prompt, pass, PASS_MAX + 2, flags) == NULL)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
len = strlen(pass);
|
||||||
|
if (len == PASS_MAX + 1) {
|
||||||
|
errno = ENOBUFS;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pass;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
freezero(pass, PASS_MAX + 2);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
agetpass(const char *prompt)
|
||||||
|
{
|
||||||
|
return agetpass_internal(prompt, RPP_REQUIRE_TTY);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
agetpass_stdin()
|
||||||
|
{
|
||||||
|
return agetpass_internal(NULL, RPP_STDIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
erase_pass(char *pass)
|
||||||
|
{
|
||||||
|
freezero(pass, PASS_MAX + 2);
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2022-2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_AGETPASS_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_AGETPASS_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
|
||||||
|
void erase_pass(char *pass);
|
||||||
|
ATTR_MALLOC(erase_pass)
|
||||||
|
char *agetpass(const char *prompt);
|
||||||
|
char *agetpass_stdin();
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
* SPDX-FileCopyrightText: 1996 - 1998, Marek Michałkiewicz
|
* SPDX-FileCopyrightText: 1996 - 1998, Marek Michałkiewicz
|
||||||
* SPDX-FileCopyrightText: 2003 - 2006, Tomasz Kłoczko
|
* SPDX-FileCopyrightText: 2003 - 2006, Tomasz Kłoczko
|
||||||
* SPDX-FileCopyrightText: 2008 , Nicolas François
|
* SPDX-FileCopyrightText: 2008 , Nicolas François
|
||||||
|
* SPDX-FileCopyrightText: 2023 , Alejandro Colomar <alx@kernel.org>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
@@ -11,7 +12,7 @@
|
|||||||
to be worth copyrighting :-). I did that because a lot of code used
|
to be worth copyrighting :-). I did that because a lot of code used
|
||||||
malloc and strdup without checking for NULL pointer, and I like some
|
malloc and strdup without checking for NULL pointer, and I like some
|
||||||
message better than a core dump... --marekm
|
message better than a core dump... --marekm
|
||||||
|
|
||||||
Yeh, but. Remember that bailing out might leave the system in some
|
Yeh, but. Remember that bailing out might leave the system in some
|
||||||
bizarre state. You really want to put in error checking, then add
|
bizarre state. You really want to put in error checking, then add
|
||||||
some back-out failure recovery code. -- jfh */
|
some back-out failure recovery code. -- jfh */
|
||||||
@@ -20,27 +21,53 @@
|
|||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include "alloc.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "shadowlog.h"
|
#include "shadowlog.h"
|
||||||
|
|
||||||
/*@maynotreturn@*/ /*@only@*//*@out@*//*@notnull@*/void *xmalloc (size_t size)
|
|
||||||
{
|
|
||||||
void *ptr;
|
|
||||||
|
|
||||||
ptr = malloc (size);
|
extern inline void *xmalloc(size_t size);
|
||||||
if (NULL == ptr) {
|
extern inline void *xmallocarray(size_t nmemb, size_t size);
|
||||||
(void) fprintf (log_get_logfd(),
|
extern inline void *mallocarray(size_t nmemb, size_t size);
|
||||||
_("%s: failed to allocate memory: %s\n"),
|
extern inline void *reallocarrayf(void *p, size_t nmemb, size_t size);
|
||||||
log_get_progname(), strerror (errno));
|
extern inline char *xstrdup(const char *str);
|
||||||
exit (13);
|
|
||||||
}
|
|
||||||
return ptr;
|
void *
|
||||||
|
xcalloc(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
p = calloc(nmemb, size);
|
||||||
|
if (p == NULL)
|
||||||
|
goto x;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
|
||||||
|
x:
|
||||||
|
fprintf(log_get_logfd(), _("%s: %s\n"),
|
||||||
|
log_get_progname(), strerror(errno));
|
||||||
|
exit(13);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*@maynotreturn@*/ /*@only@*//*@notnull@*/char *xstrdup (const char *str)
|
|
||||||
|
void *
|
||||||
|
xreallocarray(void *p, size_t nmemb, size_t size)
|
||||||
{
|
{
|
||||||
return strcpy (xmalloc (strlen (str) + 1), str);
|
p = reallocarrayf(p, nmemb, size);
|
||||||
|
if (p == NULL)
|
||||||
|
goto x;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
|
||||||
|
x:
|
||||||
|
fprintf(log_get_logfd(), _("%s: %s\n"),
|
||||||
|
log_get_progname(), strerror(errno));
|
||||||
|
exit(13);
|
||||||
}
|
}
|
||||||
+101
@@ -0,0 +1,101 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_MALLOC_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_MALLOC_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define CALLOC(n, type) ((type *) calloc(n, sizeof(type)))
|
||||||
|
#define XCALLOC(n, type) ((type *) xcalloc(n, sizeof(type)))
|
||||||
|
#define MALLOC(n, type) ((type *) mallocarray(n, sizeof(type)))
|
||||||
|
#define XMALLOC(n, type) ((type *) xmallocarray(n, sizeof(type)))
|
||||||
|
|
||||||
|
#define REALLOC(ptr, n, type) \
|
||||||
|
( \
|
||||||
|
_Generic(ptr, type *: (type *) reallocarray(ptr, n, sizeof(type))) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define REALLOCF(ptr, n, type) \
|
||||||
|
( \
|
||||||
|
_Generic(ptr, type *: (type *) reallocarrayf(ptr, n, sizeof(type))) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define XREALLOC(ptr, n, type) \
|
||||||
|
( \
|
||||||
|
_Generic(ptr, type *: (type *) xreallocarray(ptr, n, sizeof(type))) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline void *xmalloc(size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline void *xmallocarray(size_t nmemb, size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline void *mallocarray(size_t nmemb, size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline void *reallocarrayf(void *p, size_t nmemb, size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline char *xstrdup(const char *str);
|
||||||
|
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
void *xcalloc(size_t nmemb, size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
void *xreallocarray(void *p, size_t nmemb, size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
xmalloc(size_t size)
|
||||||
|
{
|
||||||
|
return xmallocarray(1, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
xmallocarray(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
return xreallocarray(NULL, nmemb, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
mallocarray(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
return reallocarray(NULL, nmemb, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
reallocarrayf(void *p, size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
void *q;
|
||||||
|
|
||||||
|
q = reallocarray(p, nmemb, size);
|
||||||
|
|
||||||
|
/* realloc(p, 0) is equivalent to free(p); avoid double free. */
|
||||||
|
if (q == NULL && nmemb != 0 && size != 0)
|
||||||
|
free(p);
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline char *
|
||||||
|
xstrdup(const char *str)
|
||||||
|
{
|
||||||
|
return strcpy(XMALLOC(strlen(str) + 1, char), str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "atoi/a2i.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern inline int a2sh_c(short *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, short min, short max);
|
||||||
|
extern inline int a2si_c(int *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, int min, int max);
|
||||||
|
extern inline int a2sl_c(long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, long min, long max);
|
||||||
|
extern inline int a2sll_c(long long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, long long min, long long max);
|
||||||
|
extern inline int a2uh_c(unsigned short *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned short min,
|
||||||
|
unsigned short max);
|
||||||
|
extern inline int a2ui_c(unsigned int *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned int min, unsigned int max);
|
||||||
|
extern inline int a2ul_c(unsigned long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned long min, unsigned long max);
|
||||||
|
extern inline int a2ull_c(unsigned long long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned long long min,
|
||||||
|
unsigned long long max);
|
||||||
|
|
||||||
|
|
||||||
|
extern inline int a2sh_nc(short *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, short min, short max);
|
||||||
|
extern inline int a2si_nc(int *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, int min, int max);
|
||||||
|
extern inline int a2sl_nc(long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, long min, long max);
|
||||||
|
extern inline int a2sll_nc(long long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, long long min, long long max);
|
||||||
|
extern inline int a2uh_nc(unsigned short *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned short min, unsigned short max);
|
||||||
|
extern inline int a2ui_nc(unsigned int *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned int min, unsigned int max);
|
||||||
|
extern inline int a2ul_nc(unsigned long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned long min, unsigned long max);
|
||||||
|
extern inline int a2ull_nc(unsigned long long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned long long min,
|
||||||
|
unsigned long long max);
|
||||||
+386
@@ -0,0 +1,386 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_ATOI_A2I_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_ATOI_A2I_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "atoi/strtoi.h"
|
||||||
|
#include "atoi/strtou_noneg.h"
|
||||||
|
#include "attr.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See the manual of these macros in liba2i's documentation:
|
||||||
|
* <http://www.alejandro-colomar.es/share/dist/liba2i/git/HEAD/liba2i-HEAD.pdf>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define a2i(TYPE, n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic((void (*)(TYPE, typeof(s))) 0, \
|
||||||
|
void (*)(short, const char *): a2sh_c, \
|
||||||
|
void (*)(short, const void *): a2sh_c, \
|
||||||
|
void (*)(short, char *): a2sh_nc, \
|
||||||
|
void (*)(short, void *): a2sh_nc, \
|
||||||
|
void (*)(int, const char *): a2si_c, \
|
||||||
|
void (*)(int, const void *): a2si_c, \
|
||||||
|
void (*)(int, char *): a2si_nc, \
|
||||||
|
void (*)(int, void *): a2si_nc, \
|
||||||
|
void (*)(long, const char *): a2sl_c, \
|
||||||
|
void (*)(long, const void *): a2sl_c, \
|
||||||
|
void (*)(long, char *): a2sl_nc, \
|
||||||
|
void (*)(long, void *): a2sl_nc, \
|
||||||
|
void (*)(long long, const char *): a2sll_c, \
|
||||||
|
void (*)(long long, const void *): a2sll_c, \
|
||||||
|
void (*)(long long, char *): a2sll_nc, \
|
||||||
|
void (*)(long long, void *): a2sll_nc, \
|
||||||
|
void (*)(unsigned short, const char *): a2uh_c, \
|
||||||
|
void (*)(unsigned short, const void *): a2uh_c, \
|
||||||
|
void (*)(unsigned short, char *): a2uh_nc, \
|
||||||
|
void (*)(unsigned short, void *): a2uh_nc, \
|
||||||
|
void (*)(unsigned int, const char *): a2ui_c, \
|
||||||
|
void (*)(unsigned int, const void *): a2ui_c, \
|
||||||
|
void (*)(unsigned int, char *): a2ui_nc, \
|
||||||
|
void (*)(unsigned int, void *): a2ui_nc, \
|
||||||
|
void (*)(unsigned long, const char *): a2ul_c, \
|
||||||
|
void (*)(unsigned long, const void *): a2ul_c, \
|
||||||
|
void (*)(unsigned long, char *): a2ul_nc, \
|
||||||
|
void (*)(unsigned long, void *): a2ul_nc, \
|
||||||
|
void (*)(unsigned long long, const char *): a2ull_c, \
|
||||||
|
void (*)(unsigned long long, const void *): a2ull_c, \
|
||||||
|
void (*)(unsigned long long, char *): a2ull_nc, \
|
||||||
|
void (*)(unsigned long long, void *): a2ull_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#define a2sh(n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic(s, \
|
||||||
|
const char *: a2sh_c, \
|
||||||
|
const void *: a2sh_c, \
|
||||||
|
char *: a2sh_nc, \
|
||||||
|
void *: a2sh_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define a2si(n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic(s, \
|
||||||
|
const char *: a2si_c, \
|
||||||
|
const void *: a2si_c, \
|
||||||
|
char *: a2si_nc, \
|
||||||
|
void *: a2si_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define a2sl(n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic(s, \
|
||||||
|
const char *: a2sl_c, \
|
||||||
|
const void *: a2sl_c, \
|
||||||
|
char *: a2sl_nc, \
|
||||||
|
void *: a2sl_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define a2sll(n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic(s, \
|
||||||
|
const char *: a2sll_c, \
|
||||||
|
const void *: a2sll_c, \
|
||||||
|
char *: a2sll_nc, \
|
||||||
|
void *: a2sll_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define a2uh(n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic(s, \
|
||||||
|
const char *: a2uh_c, \
|
||||||
|
const void *: a2uh_c, \
|
||||||
|
char *: a2uh_nc, \
|
||||||
|
void *: a2uh_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define a2ui(n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic(s, \
|
||||||
|
const char *: a2ui_c, \
|
||||||
|
const void *: a2ui_c, \
|
||||||
|
char *: a2ui_nc, \
|
||||||
|
void *: a2ui_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define a2ul(n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic(s, \
|
||||||
|
const char *: a2ul_c, \
|
||||||
|
const void *: a2ul_c, \
|
||||||
|
char *: a2ul_nc, \
|
||||||
|
void *: a2ul_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
#define a2ull(n, s, ...) \
|
||||||
|
( \
|
||||||
|
_Generic(s, \
|
||||||
|
const char *: a2ull_c, \
|
||||||
|
const void *: a2ull_c, \
|
||||||
|
char *: a2ull_nc, \
|
||||||
|
void *: a2ull_nc \
|
||||||
|
)(n, s, __VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2sh_c(short *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, short min, short max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2si_c(int *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, int min, int max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2sl_c(long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, long min, long max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2sll_c(long long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, long long min, long long max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2uh_c(unsigned short *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned short min,
|
||||||
|
unsigned short max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2ui_c(unsigned int *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned int min, unsigned int max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2ul_c(unsigned long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned long min, unsigned long max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2ull_c(unsigned long long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned long long min,
|
||||||
|
unsigned long long max);
|
||||||
|
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2sh_nc(short *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, short min, short max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2si_nc(int *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, int min, int max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2sl_nc(long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, long min, long max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2sll_nc(long long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, long long min, long long max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2uh_nc(unsigned short *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned short min, unsigned short max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2ui_nc(unsigned int *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned int min, unsigned int max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2ul_nc(unsigned long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned long min, unsigned long max);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
||||||
|
inline int a2ull_nc(unsigned long long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned long long min,
|
||||||
|
unsigned long long max);
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2sh_c(short *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, short min, short max)
|
||||||
|
{
|
||||||
|
return a2sh(n, (char *) s, (char **) endp, base, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2si_c(int *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, int min, int max)
|
||||||
|
{
|
||||||
|
return a2si(n, (char *) s, (char **) endp, base, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2sl_c(long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, long min, long max)
|
||||||
|
{
|
||||||
|
return a2sl(n, (char *) s, (char **) endp, base, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2sll_c(long long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, long long min, long long max)
|
||||||
|
{
|
||||||
|
return a2sll(n, (char *) s, (char **) endp, base, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2uh_c(unsigned short *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned short min,
|
||||||
|
unsigned short max)
|
||||||
|
{
|
||||||
|
return a2uh(n, (char *) s, (char **) endp, base, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2ui_c(unsigned int *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned int min, unsigned int max)
|
||||||
|
{
|
||||||
|
return a2ui(n, (char *) s, (char **) endp, base, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2ul_c(unsigned long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned long min, unsigned long max)
|
||||||
|
{
|
||||||
|
return a2ul(n, (char *) s, (char **) endp, base, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2ull_c(unsigned long long *restrict n, const char *s,
|
||||||
|
const char **restrict endp, int base, unsigned long long min,
|
||||||
|
unsigned long long max)
|
||||||
|
{
|
||||||
|
return a2ull(n, (char *) s, (char **) endp, base, min, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2sh_nc(short *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, short min, short max)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
*n = strtoi_(s, endp, base, min, max, &status);
|
||||||
|
if (status != 0) {
|
||||||
|
errno = status;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2si_nc(int *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, int min, int max)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
*n = strtoi_(s, endp, base, min, max, &status);
|
||||||
|
if (status != 0) {
|
||||||
|
errno = status;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2sl_nc(long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, long min, long max)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
*n = strtoi_(s, endp, base, min, max, &status);
|
||||||
|
if (status != 0) {
|
||||||
|
errno = status;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2sll_nc(long long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, long long min, long long max)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
*n = strtoi_(s, endp, base, min, max, &status);
|
||||||
|
if (status != 0) {
|
||||||
|
errno = status;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2uh_nc(unsigned short *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned short min,
|
||||||
|
unsigned short max)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
*n = strtou_noneg(s, endp, base, min, max, &status);
|
||||||
|
if (status != 0) {
|
||||||
|
errno = status;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2ui_nc(unsigned int *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned int min, unsigned int max)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
*n = strtou_noneg(s, endp, base, min, max, &status);
|
||||||
|
if (status != 0) {
|
||||||
|
errno = status;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2ul_nc(unsigned long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned long min, unsigned long max)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
*n = strtou_noneg(s, endp, base, min, max, &status);
|
||||||
|
if (status != 0) {
|
||||||
|
errno = status;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
a2ull_nc(unsigned long long *restrict n, char *s,
|
||||||
|
char **restrict endp, int base, unsigned long long min,
|
||||||
|
unsigned long long max)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
*n = strtou_noneg(s, endp, base, min, max, &status);
|
||||||
|
if (status != 0) {
|
||||||
|
errno = status;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2007-2009, Nicolas François
|
||||||
|
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "atoi/str2i.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern inline int str2sh(short *restrict n, const char *restrict s);
|
||||||
|
extern inline int str2si(int *restrict n, const char *restrict s);
|
||||||
|
extern inline int str2sl(long *restrict n, const char *restrict s);
|
||||||
|
extern inline int str2sll(long long *restrict n, const char *restrict s);
|
||||||
|
extern inline int str2uh(unsigned short *restrict n, const char *restrict s);
|
||||||
|
extern inline int str2ui(unsigned int *restrict n, const char *restrict s);
|
||||||
|
extern inline int str2ul(unsigned long *restrict n, const char *restrict s);
|
||||||
|
extern inline int str2ull(unsigned long long *restrict n, const char *restrict s);
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2007-2009, Nicolas François
|
||||||
|
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_ATOI_STR2I_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_ATOI_STR2I_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "atoi/a2i.h"
|
||||||
|
#include "attr.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define str2i(TYPE, ...) \
|
||||||
|
( \
|
||||||
|
_Generic((TYPE) 0, \
|
||||||
|
short: str2sh, \
|
||||||
|
int: str2si, \
|
||||||
|
long: str2sl, \
|
||||||
|
long long: str2sll, \
|
||||||
|
unsigned short: str2uh, \
|
||||||
|
unsigned int: str2ui, \
|
||||||
|
unsigned long: str2ul, \
|
||||||
|
unsigned long long: str2ull \
|
||||||
|
)(__VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
||||||
|
inline int str2sh(short *restrict n, const char *restrict s);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
||||||
|
inline int str2si(int *restrict n, const char *restrict s);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
||||||
|
inline int str2sl(long *restrict n, const char *restrict s);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
||||||
|
inline int str2sll(long long *restrict n, const char *restrict s);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
||||||
|
inline int str2uh(unsigned short *restrict n, const char *restrict s);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
||||||
|
inline int str2ui(unsigned int *restrict n, const char *restrict s);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
||||||
|
inline int str2ul(unsigned long *restrict n, const char *restrict s);
|
||||||
|
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
||||||
|
inline int str2ull(unsigned long long *restrict n, const char *restrict s);
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
str2sh(short *restrict n, const char *restrict s)
|
||||||
|
{
|
||||||
|
return a2sh(n, s, NULL, 0, SHRT_MIN, SHRT_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
str2si(int *restrict n, const char *restrict s)
|
||||||
|
{
|
||||||
|
return a2si(n, s, NULL, 0, INT_MIN, INT_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
str2sl(long *restrict n, const char *restrict s)
|
||||||
|
{
|
||||||
|
return a2sl(n, s, NULL, 0, LONG_MIN, LONG_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
str2sll(long long *restrict n, const char *restrict s)
|
||||||
|
{
|
||||||
|
return a2sll(n, s, NULL, 0, LLONG_MIN, LLONG_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
str2uh(unsigned short *restrict n, const char *restrict s)
|
||||||
|
{
|
||||||
|
return a2uh(n, s, NULL, 0, 0, USHRT_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
str2ui(unsigned int *restrict n, const char *restrict s)
|
||||||
|
{
|
||||||
|
return a2ui(n, s, NULL, 0, 0, UINT_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
str2ul(unsigned long *restrict n, const char *restrict s)
|
||||||
|
{
|
||||||
|
return a2ul(n, s, NULL, 0, 0, ULONG_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline int
|
||||||
|
str2ull(unsigned long long *restrict n, const char *restrict s)
|
||||||
|
{
|
||||||
|
return a2ull(n, s, NULL, 0, 0, ULLONG_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "atoi/strtoi.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern inline intmax_t strtoi_(const char *s, char **restrict endp, int base,
|
||||||
|
intmax_t min, intmax_t max, int *restrict status);
|
||||||
|
extern inline uintmax_t strtou_(const char *s, char **restrict endp, int base,
|
||||||
|
uintmax_t min, uintmax_t max, int *restrict status);
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_ATOI_STRTOI_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_ATOI_STRTOI_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define strtoNmax(TYPE, ...) \
|
||||||
|
( \
|
||||||
|
_Generic((TYPE) 0, \
|
||||||
|
intmax_t: strtoimax, \
|
||||||
|
uintmax_t: strtoumax \
|
||||||
|
)(__VA_ARGS__) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#define strtoN(s, endp, base, min, max, status, TYPE) \
|
||||||
|
({ \
|
||||||
|
const char *s_ = s; \
|
||||||
|
char **endp_ = endp; \
|
||||||
|
int base_ = base; \
|
||||||
|
TYPE min_ = min; \
|
||||||
|
TYPE max_ = max; \
|
||||||
|
int *status_ = status; \
|
||||||
|
\
|
||||||
|
int e_, st_; \
|
||||||
|
char *end_; \
|
||||||
|
TYPE n_; \
|
||||||
|
\
|
||||||
|
if (endp_ == NULL) \
|
||||||
|
endp_ = &end_; \
|
||||||
|
if (status_ == NULL) \
|
||||||
|
status_ = &st_; \
|
||||||
|
\
|
||||||
|
if (base_ != 0 && (base_ < 0 || base_ > 36)) { \
|
||||||
|
*status_ = EINVAL; \
|
||||||
|
n_ = 0; \
|
||||||
|
\
|
||||||
|
} else { \
|
||||||
|
e_ = errno; \
|
||||||
|
errno = 0; \
|
||||||
|
n_ = strtoNmax(TYPE, s_, endp_, base_); \
|
||||||
|
\
|
||||||
|
if (*endp_ == s_) \
|
||||||
|
*status_ = ECANCELED; \
|
||||||
|
else if (errno == ERANGE || n_ < min_ || n_ > max_) \
|
||||||
|
*status_ = ERANGE; \
|
||||||
|
else if (**endp_ != '\0') \
|
||||||
|
*status_ = ENOTSUP; \
|
||||||
|
else \
|
||||||
|
*status_ = 0; \
|
||||||
|
\
|
||||||
|
errno = e_; \
|
||||||
|
} \
|
||||||
|
MAX(min_, MIN(max_, n_)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
ATTR_STRING(1) ATTR_ACCESS(write_only, 2) ATTR_ACCESS(write_only, 6)
|
||||||
|
inline intmax_t strtoi_(const char *s, char **restrict endp, int base,
|
||||||
|
intmax_t min, intmax_t max, int *restrict status);
|
||||||
|
ATTR_STRING(1) ATTR_ACCESS(write_only, 2) ATTR_ACCESS(write_only, 6)
|
||||||
|
inline uintmax_t strtou_(const char *s, char **restrict endp, int base,
|
||||||
|
uintmax_t min, uintmax_t max, int *restrict status);
|
||||||
|
|
||||||
|
|
||||||
|
inline intmax_t
|
||||||
|
strtoi_(const char *s, char **restrict endp, int base,
|
||||||
|
intmax_t min, intmax_t max, int *restrict status)
|
||||||
|
{
|
||||||
|
return strtoN(s, endp, base, min, max, status, intmax_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline uintmax_t
|
||||||
|
strtou_(const char *s, char **restrict endp, int base,
|
||||||
|
uintmax_t min, uintmax_t max, int *restrict status)
|
||||||
|
{
|
||||||
|
return strtoN(s, endp, base, min, max, status, uintmax_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "atoi/strtou_noneg.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern inline uintmax_t strtou_noneg(const char *s, char **restrict endp,
|
||||||
|
int base, uintmax_t min, uintmax_t max, int *restrict status);
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_ATOI_STRTOU_NONEG_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_ATOI_STRTOU_NONEG_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "atoi/strtoi.h"
|
||||||
|
#include "attr.h"
|
||||||
|
|
||||||
|
|
||||||
|
ATTR_STRING(1) ATTR_ACCESS(write_only, 2) ATTR_ACCESS(write_only, 6)
|
||||||
|
inline uintmax_t strtou_noneg(const char *s, char **restrict endp,
|
||||||
|
int base, uintmax_t min, uintmax_t max, int *restrict status);
|
||||||
|
|
||||||
|
|
||||||
|
inline uintmax_t
|
||||||
|
strtou_noneg(const char *s, char **restrict endp, int base,
|
||||||
|
uintmax_t min, uintmax_t max, int *restrict status)
|
||||||
|
{
|
||||||
|
int st;
|
||||||
|
|
||||||
|
if (status == NULL)
|
||||||
|
status = &st;
|
||||||
|
if (strtoi_(s, endp, base, 0, 1, status) == 0 && *status == ERANGE)
|
||||||
|
return min;
|
||||||
|
|
||||||
|
return strtou_(s, endp, base, min, max, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
+33
@@ -0,0 +1,33 @@
|
|||||||
|
#ifndef SHADOW_INCLUDE_LIB_ATTR_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_ATTR_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
# define MAYBE_UNUSED __attribute__((unused))
|
||||||
|
# define NORETURN __attribute__((__noreturn__))
|
||||||
|
# define format_attr(type, fmt, va) __attribute__((format(type, fmt, va)))
|
||||||
|
# define ATTR_ACCESS(...) __attribute__((access(__VA_ARGS__)))
|
||||||
|
#else
|
||||||
|
# define MAYBE_UNUSED
|
||||||
|
# define NORETURN
|
||||||
|
# define format_attr(type, fmt, va)
|
||||||
|
# define ATTR_ACCESS(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (__GNUC__ >= 11) && !defined(__clang__)
|
||||||
|
# define ATTR_MALLOC(deallocator) [[gnu::malloc(deallocator)]]
|
||||||
|
#else
|
||||||
|
# define ATTR_MALLOC(deallocator)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (__GNUC__ >= 14)
|
||||||
|
# define ATTR_STRING(...) [[gnu::null_terminated_string_arg(__VA_ARGS__)]]
|
||||||
|
#else
|
||||||
|
# define ATTR_STRING(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -21,6 +21,8 @@
|
|||||||
#include <libaudit.h>
|
#include <libaudit.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "shadowlog.h"
|
#include "shadowlog.h"
|
||||||
int audit_fd;
|
int audit_fd;
|
||||||
@@ -54,7 +56,7 @@ void audit_help_open (void)
|
|||||||
* id - uid or gid that the operation is being performed on. This is used
|
* id - uid or gid that the operation is being performed on. This is used
|
||||||
* only when user is NULL.
|
* only when user is NULL.
|
||||||
*/
|
*/
|
||||||
void audit_logger (int type, unused const char *pgname, const char *op,
|
void audit_logger (int type, MAYBE_UNUSED const char *pgname, const char *op,
|
||||||
const char *name, unsigned int id,
|
const char *name, unsigned int id,
|
||||||
shadow_audit_result result)
|
shadow_audit_result result)
|
||||||
{
|
{
|
||||||
@@ -62,7 +64,7 @@ void audit_logger (int type, unused const char *pgname, const char *op,
|
|||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
audit_log_acct_message (audit_fd, type, NULL, op, name, id,
|
audit_log_acct_message (audit_fd, type, NULL, op, name, id,
|
||||||
NULL, NULL, NULL, (int) result);
|
NULL, NULL, NULL, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,11 +79,11 @@ void audit_logger_message (const char *message, shadow_audit_result result)
|
|||||||
NULL, /* hostname */
|
NULL, /* hostname */
|
||||||
NULL, /* addr */
|
NULL, /* addr */
|
||||||
NULL, /* tty */
|
NULL, /* tty */
|
||||||
(int) result);
|
result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* WITH_AUDIT */
|
#else /* WITH_AUDIT */
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
extern int ISO_C_forbids_an_empty_translation_unit;
|
||||||
#endif /* WITH_AUDIT */
|
#endif /* WITH_AUDIT */
|
||||||
|
|
||||||
@@ -21,6 +21,10 @@
|
|||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
/*@observer@*/const char *Basename (const char *str)
|
/*@observer@*/const char *Basename (const char *str)
|
||||||
{
|
{
|
||||||
|
if (str == NULL) {
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
char *cp = strrchr (str, '/');
|
char *cp = strrchr (str, '/');
|
||||||
|
|
||||||
return (NULL != cp) ? cp + 1 : str;
|
return (NULL != cp) ? cp + 1 : str;
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2022 - 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#ident "$Id$"
|
||||||
|
|
||||||
|
#include "bit.h"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern inline unsigned long bit_ceilul(unsigned long x);
|
||||||
|
extern inline unsigned long bit_ceil_wrapul(unsigned long x);
|
||||||
|
extern inline int leading_zerosul(unsigned long x);
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2022 - 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_BIT_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_BIT_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef ULONG_WIDTH
|
||||||
|
#define ULONG_WIDTH (sizeof(unsigned long) * CHAR_BIT)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned long bit_ceilul(unsigned long x);
|
||||||
|
inline unsigned long bit_ceil_wrapul(unsigned long x);
|
||||||
|
inline int leading_zerosul(unsigned long x);
|
||||||
|
|
||||||
|
|
||||||
|
/* stdc_bit_ceilul(3) */
|
||||||
|
inline unsigned long
|
||||||
|
bit_ceilul(unsigned long x)
|
||||||
|
{
|
||||||
|
return 1 + (ULONG_MAX >> leading_zerosul(x));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* stdc_bit_ceilul(3), but wrap instead of having Undefined Behavior */
|
||||||
|
inline unsigned long
|
||||||
|
bit_ceil_wrapul(unsigned long x)
|
||||||
|
{
|
||||||
|
if (x == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return bit_ceilul(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stdc_leading_zerosul(3) */
|
||||||
|
inline int
|
||||||
|
leading_zerosul(unsigned long x)
|
||||||
|
{
|
||||||
|
return (x == 0) ? ULONG_WIDTH : __builtin_clzl(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -39,7 +39,7 @@ static int run_btrfs_subvolume_cmd(const char *subcmd, const char *arg1, const c
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
if (access(cmd, X_OK)) {
|
if (!cmd || access(cmd, X_OK)) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2022-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_CAST_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_CAST_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define const_cast(T, p) _Generic(p, const T: (T) (p))
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
/*
|
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
||||||
* SPDX-FileCopyrightText: 1990 - 1994, Julianne Frances Haugh
|
// SPDX-FileCopyrightText: 1996-2000, Marek Michałkiewicz
|
||||||
* SPDX-FileCopyrightText: 1996 - 2000, Marek Michałkiewicz
|
// SPDX-FileCopyrightText: 2001-2005, Tomasz Kłoczko
|
||||||
* SPDX-FileCopyrightText: 2001 - 2005, Tomasz Kłoczko
|
// SPDX-FileCopyrightText: 2005-2008, Nicolas François
|
||||||
* SPDX-FileCopyrightText: 2005 - 2008, Nicolas François
|
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
*
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* is_valid_user_name(), is_valid_group_name() - check the new user/group
|
* is_valid_user_name(), is_valid_group_name() - check the new user/group
|
||||||
@@ -15,16 +14,39 @@
|
|||||||
* false - bad name
|
* false - bad name
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "chkname.h"
|
#include "chkname.h"
|
||||||
|
|
||||||
|
|
||||||
int allow_bad_names = false;
|
int allow_bad_names = false;
|
||||||
|
|
||||||
|
|
||||||
|
size_t
|
||||||
|
login_name_max_size(void)
|
||||||
|
{
|
||||||
|
long conf;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
conf = sysconf(_SC_LOGIN_NAME_MAX);
|
||||||
|
if (conf == -1 && errno != 0)
|
||||||
|
return LOGIN_NAME_MAX;
|
||||||
|
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool is_valid_name (const char *name)
|
static bool is_valid_name (const char *name)
|
||||||
{
|
{
|
||||||
if (allow_bad_names) {
|
if (allow_bad_names) {
|
||||||
@@ -32,8 +54,8 @@ static bool is_valid_name (const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* User/group names must match gnu e-regex:
|
* User/group names must match BRE regex:
|
||||||
* [a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?
|
* [a-zA-Z0-9_.][a-zA-Z0-9_.-]*$\?
|
||||||
*
|
*
|
||||||
* as a non-POSIX, extension, allow "$" as the last char for
|
* as a non-POSIX, extension, allow "$" as the last char for
|
||||||
* sake of Samba 3.x "add machine script"
|
* sake of Samba 3.x "add machine script"
|
||||||
@@ -72,19 +94,17 @@ static bool is_valid_name (const char *name)
|
|||||||
return !numeric;
|
return !numeric;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_valid_user_name (const char *name)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* User names are limited by whatever utmp can
|
|
||||||
* handle.
|
|
||||||
*/
|
|
||||||
if (strlen (name) > USER_NAME_MAX_LENGTH) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return is_valid_name (name);
|
bool
|
||||||
|
is_valid_user_name(const char *name)
|
||||||
|
{
|
||||||
|
if (strlen(name) >= login_name_max_size())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return is_valid_name(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool is_valid_group_name (const char *name)
|
bool is_valid_group_name (const char *name)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -98,4 +118,3 @@ bool is_valid_group_name (const char *name)
|
|||||||
|
|
||||||
return is_valid_name (name);
|
return is_valid_name (name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
#ifndef _CHKNAME_H_
|
#ifndef _CHKNAME_H_
|
||||||
#define _CHKNAME_H_
|
#define _CHKNAME_H_
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* is_valid_user_name(), is_valid_group_name() - check the new user/group
|
* is_valid_user_name(), is_valid_group_name() - check the new user/group
|
||||||
* name for validity;
|
* name for validity;
|
||||||
@@ -19,8 +20,14 @@
|
|||||||
* false - bad name
|
* false - bad name
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "defines.h"
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern size_t login_name_max_size(void);
|
||||||
extern bool is_valid_user_name (const char *name);
|
extern bool is_valid_user_name (const char *name);
|
||||||
extern bool is_valid_group_name (const char *name);
|
extern bool is_valid_group_name (const char *name);
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ void chown_tty (const struct passwd *info)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( (fchown (STDIN_FILENO, info->pw_uid, gid) != 0)
|
if ( (fchown (STDIN_FILENO, info->pw_uid, gid) != 0)
|
||||||
|| (fchmod (STDIN_FILENO, (mode_t)getdef_num ("TTYPERM", 0600)) != 0)) {
|
|| (fchmod (STDIN_FILENO, getdef_num ("TTYPERM", 0600)) != 0)) {
|
||||||
int err = errno;
|
int err = errno;
|
||||||
FILE *shadow_logfd = log_get_logfd();
|
FILE *shadow_logfd = log_get_logfd();
|
||||||
|
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "groupio.h"
|
#include "groupio.h"
|
||||||
#include "sgroupio.h"
|
#include "sgroupio.h"
|
||||||
@@ -22,7 +23,7 @@
|
|||||||
*/
|
*/
|
||||||
void cleanup_report_add_group (void *group_name)
|
void cleanup_report_add_group (void *group_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)group_name;
|
const char *name = group_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR, "failed to add group %s", name));
|
SYSLOG ((LOG_ERR, "failed to add group %s", name));
|
||||||
#ifdef WITH_AUDIT
|
#ifdef WITH_AUDIT
|
||||||
@@ -40,7 +41,7 @@ void cleanup_report_add_group (void *group_name)
|
|||||||
*/
|
*/
|
||||||
void cleanup_report_del_group (void *group_name)
|
void cleanup_report_del_group (void *group_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)group_name;
|
const char *name = group_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR, "failed to remove group %s", name));
|
SYSLOG ((LOG_ERR, "failed to remove group %s", name));
|
||||||
#ifdef WITH_AUDIT
|
#ifdef WITH_AUDIT
|
||||||
@@ -95,7 +96,7 @@ void cleanup_report_mod_gshadow (void *cleanup_info)
|
|||||||
*/
|
*/
|
||||||
void cleanup_report_add_group_group (void *group_name)
|
void cleanup_report_add_group_group (void *group_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)group_name;
|
const char *name = group_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR, "failed to add group %s to %s", name, gr_dbname ()));
|
SYSLOG ((LOG_ERR, "failed to add group %s to %s", name, gr_dbname ()));
|
||||||
#ifdef WITH_AUDIT
|
#ifdef WITH_AUDIT
|
||||||
@@ -115,7 +116,7 @@ void cleanup_report_add_group_group (void *group_name)
|
|||||||
*/
|
*/
|
||||||
void cleanup_report_add_group_gshadow (void *group_name)
|
void cleanup_report_add_group_gshadow (void *group_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)group_name;
|
const char *name = group_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR, "failed to add group %s to %s", name, sgr_dbname ()));
|
SYSLOG ((LOG_ERR, "failed to add group %s to %s", name, sgr_dbname ()));
|
||||||
#ifdef WITH_AUDIT
|
#ifdef WITH_AUDIT
|
||||||
@@ -136,7 +137,7 @@ void cleanup_report_add_group_gshadow (void *group_name)
|
|||||||
*/
|
*/
|
||||||
void cleanup_report_del_group_group (void *group_name)
|
void cleanup_report_del_group_group (void *group_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)group_name;
|
const char *name = group_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR,
|
SYSLOG ((LOG_ERR,
|
||||||
"failed to remove group %s from %s",
|
"failed to remove group %s from %s",
|
||||||
@@ -159,7 +160,7 @@ void cleanup_report_del_group_group (void *group_name)
|
|||||||
*/
|
*/
|
||||||
void cleanup_report_del_group_gshadow (void *group_name)
|
void cleanup_report_del_group_gshadow (void *group_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)group_name;
|
const char *name = group_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR,
|
SYSLOG ((LOG_ERR,
|
||||||
"failed to remove group %s from %s",
|
"failed to remove group %s from %s",
|
||||||
@@ -178,7 +179,7 @@ void cleanup_report_del_group_gshadow (void *group_name)
|
|||||||
*
|
*
|
||||||
* It should be registered after the group file is successfully locked.
|
* It should be registered after the group file is successfully locked.
|
||||||
*/
|
*/
|
||||||
void cleanup_unlock_group (unused void *arg)
|
void cleanup_unlock_group (MAYBE_UNUSED void *arg)
|
||||||
{
|
{
|
||||||
if (gr_unlock () == 0) {
|
if (gr_unlock () == 0) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
@@ -198,7 +199,7 @@ void cleanup_unlock_group (unused void *arg)
|
|||||||
*
|
*
|
||||||
* It should be registered after the gshadow file is successfully locked.
|
* It should be registered after the gshadow file is successfully locked.
|
||||||
*/
|
*/
|
||||||
void cleanup_unlock_gshadow (unused void *arg)
|
void cleanup_unlock_gshadow (MAYBE_UNUSED void *arg)
|
||||||
{
|
{
|
||||||
if (sgr_unlock () == 0) {
|
if (sgr_unlock () == 0) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "pwio.h"
|
#include "pwio.h"
|
||||||
#include "shadowio.h"
|
#include "shadowio.h"
|
||||||
@@ -16,13 +17,13 @@
|
|||||||
#include "shadowlog.h"
|
#include "shadowlog.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cleanup_report_add_user - Report failure to add an user to the system
|
* cleanup_report_add_user - Report failure to add a user to the system
|
||||||
*
|
*
|
||||||
* It should be registered when it is decided to add an user to the system.
|
* It should be registered when it is decided to add a user to the system.
|
||||||
*/
|
*/
|
||||||
void cleanup_report_add_user (void *user_name)
|
void cleanup_report_add_user (void *user_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)user_name;
|
const char *name = user_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR, "failed to add user %s", name));
|
SYSLOG ((LOG_ERR, "failed to add user %s", name));
|
||||||
#ifdef WITH_AUDIT
|
#ifdef WITH_AUDIT
|
||||||
@@ -51,15 +52,15 @@ void cleanup_report_mod_passwd (void *cleanup_info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cleanup_report_add_user_passwd - Report failure to add an user to
|
* cleanup_report_add_user_passwd - Report failure to add a user to
|
||||||
* /etc/passwd
|
* /etc/passwd
|
||||||
*
|
*
|
||||||
* It should be registered when it is decided to add an user to the
|
* It should be registered when it is decided to add a user to the
|
||||||
* /etc/passwd database.
|
* /etc/passwd database.
|
||||||
*/
|
*/
|
||||||
void cleanup_report_add_user_passwd (void *user_name)
|
void cleanup_report_add_user_passwd (void *user_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)user_name;
|
const char *name = user_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR, "failed to add user %s to %s", name, pw_dbname ()));
|
SYSLOG ((LOG_ERR, "failed to add user %s to %s", name, pw_dbname ()));
|
||||||
#ifdef WITH_AUDIT
|
#ifdef WITH_AUDIT
|
||||||
@@ -71,15 +72,15 @@ void cleanup_report_add_user_passwd (void *user_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cleanup_report_add_user_shadow - Report failure to add an user to
|
* cleanup_report_add_user_shadow - Report failure to add a user to
|
||||||
* /etc/shadow
|
* /etc/shadow
|
||||||
*
|
*
|
||||||
* It should be registered when it is decided to add an user to the
|
* It should be registered when it is decided to add a user to the
|
||||||
* /etc/shadow database.
|
* /etc/shadow database.
|
||||||
*/
|
*/
|
||||||
void cleanup_report_add_user_shadow (void *user_name)
|
void cleanup_report_add_user_shadow (void *user_name)
|
||||||
{
|
{
|
||||||
const char *name = (const char *)user_name;
|
const char *name = user_name;
|
||||||
|
|
||||||
SYSLOG ((LOG_ERR, "failed to add user %s to %s", name, spw_dbname ()));
|
SYSLOG ((LOG_ERR, "failed to add user %s to %s", name, spw_dbname ()));
|
||||||
#ifdef WITH_AUDIT
|
#ifdef WITH_AUDIT
|
||||||
@@ -95,7 +96,7 @@ void cleanup_report_add_user_shadow (void *user_name)
|
|||||||
*
|
*
|
||||||
* It should be registered after the passwd database is successfully locked.
|
* It should be registered after the passwd database is successfully locked.
|
||||||
*/
|
*/
|
||||||
void cleanup_unlock_passwd (unused void *arg)
|
void cleanup_unlock_passwd (MAYBE_UNUSED void *arg)
|
||||||
{
|
{
|
||||||
if (pw_unlock () == 0) {
|
if (pw_unlock () == 0) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
@@ -114,7 +115,7 @@ void cleanup_unlock_passwd (unused void *arg)
|
|||||||
*
|
*
|
||||||
* It should be registered after the shadow database is successfully locked.
|
* It should be registered after the shadow database is successfully locked.
|
||||||
*/
|
*/
|
||||||
void cleanup_unlock_shadow (unused void *arg)
|
void cleanup_unlock_shadow (MAYBE_UNUSED void *arg)
|
||||||
{
|
{
|
||||||
if (spw_unlock () == 0) {
|
if (spw_unlock () == 0) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
+54
-67
@@ -21,6 +21,9 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
|
#include "memzero.h"
|
||||||
#include "nscd.h"
|
#include "nscd.h"
|
||||||
#include "sssd.h"
|
#include "sssd.h"
|
||||||
#ifdef WITH_TCB
|
#ifdef WITH_TCB
|
||||||
@@ -29,6 +32,8 @@
|
|||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "commonio.h"
|
#include "commonio.h"
|
||||||
#include "shadowlog_internal.h"
|
#include "shadowlog_internal.h"
|
||||||
|
#include "string/sprintf.h"
|
||||||
|
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static int lrename (const char *, const char *);
|
static int lrename (const char *, const char *);
|
||||||
@@ -106,9 +111,9 @@ static int check_link_count (const char *file, bool log)
|
|||||||
|
|
||||||
if (sb.st_nlink != 2) {
|
if (sb.st_nlink != 2) {
|
||||||
if (log) {
|
if (log) {
|
||||||
(void) fprintf (shadow_logfd,
|
fprintf(shadow_logfd,
|
||||||
"%s: %s: lock file already used (nlink: %u)\n",
|
"%s: %s: lock file already used (nlink: %ju)\n",
|
||||||
shadow_progname, file, sb.st_nlink);
|
shadow_progname, file, (uintmax_t) sb.st_nlink);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -119,11 +124,11 @@ static int check_link_count (const char *file, bool log)
|
|||||||
|
|
||||||
static int do_lock_file (const char *file, const char *lock, bool log)
|
static int do_lock_file (const char *file, const char *lock, bool log)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
pid_t pid;
|
int retval;
|
||||||
ssize_t len;
|
char buf[32];
|
||||||
int retval;
|
pid_t pid;
|
||||||
char buf[32];
|
ssize_t len;
|
||||||
|
|
||||||
fd = open (file, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
fd = open (file, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
||||||
if (-1 == fd) {
|
if (-1 == fd) {
|
||||||
@@ -136,9 +141,9 @@ static int do_lock_file (const char *file, const char *lock, bool log)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pid = getpid ();
|
pid = getpid ();
|
||||||
snprintf (buf, sizeof buf, "%lu", (unsigned long) pid);
|
SNPRINTF(buf, "%lu", (unsigned long) pid);
|
||||||
len = (ssize_t) strlen (buf) + 1;
|
len = (ssize_t) strlen (buf) + 1;
|
||||||
if (write (fd, buf, (size_t) len) != len) {
|
if (write_full(fd, buf, len) == -1) {
|
||||||
if (log) {
|
if (log) {
|
||||||
(void) fprintf (shadow_logfd,
|
(void) fprintf (shadow_logfd,
|
||||||
"%s: %s file write error: %s\n",
|
"%s: %s file write error: %s\n",
|
||||||
@@ -190,7 +195,7 @@ static int do_lock_file (const char *file, const char *lock, bool log)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
buf[len] = '\0';
|
buf[len] = '\0';
|
||||||
if (get_pid (buf, &pid) == 0) {
|
if (get_pid(buf, &pid) == -1) {
|
||||||
if (log) {
|
if (log) {
|
||||||
(void) fprintf (shadow_logfd,
|
(void) fprintf (shadow_logfd,
|
||||||
"%s: existing lock file %s with an invalid PID '%s'\n",
|
"%s: existing lock file %s with an invalid PID '%s'\n",
|
||||||
@@ -251,25 +256,13 @@ static /*@null@*/ /*@dependent@*/FILE *fopen_set_perms (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_FCHOWN
|
|
||||||
if (fchown (fileno (fp), sb->st_uid, sb->st_gid) != 0) {
|
if (fchown (fileno (fp), sb->st_uid, sb->st_gid) != 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
#else /* !HAVE_FCHOWN */
|
|
||||||
if (chown (name, sb->st_mode) != 0) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
#endif /* !HAVE_FCHOWN */
|
|
||||||
|
|
||||||
#ifdef HAVE_FCHMOD
|
|
||||||
if (fchmod (fileno (fp), sb->st_mode & 0664) != 0) {
|
if (fchmod (fileno (fp), sb->st_mode & 0664) != 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
#else /* !HAVE_FCHMOD */
|
|
||||||
if (chmod (name, sb->st_mode & 0664) != 0) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
#endif /* !HAVE_FCHMOD */
|
|
||||||
return fp;
|
return fp;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
@@ -349,7 +342,7 @@ static void free_linked_list (struct commonio_db *db)
|
|||||||
|
|
||||||
int commonio_setname (struct commonio_db *db, const char *name)
|
int commonio_setname (struct commonio_db *db, const char *name)
|
||||||
{
|
{
|
||||||
snprintf (db->filename, sizeof (db->filename), "%s", name);
|
SNPRINTF(db->filename, "%s", name);
|
||||||
db->setname = true;
|
db->setname = true;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -363,33 +356,25 @@ bool commonio_present (const struct commonio_db *db)
|
|||||||
|
|
||||||
int commonio_lock_nowait (struct commonio_db *db, bool log)
|
int commonio_lock_nowait (struct commonio_db *db, bool log)
|
||||||
{
|
{
|
||||||
char* file = NULL;
|
int err = 0;
|
||||||
char* lock = NULL;
|
char *file = NULL;
|
||||||
size_t lock_file_len;
|
char *lock = NULL;
|
||||||
size_t file_len;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
if (db->locked) {
|
if (db->locked) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
file_len = strlen(db->filename) + 11;/* %lu max size */
|
|
||||||
lock_file_len = strlen(db->filename) + 6; /* sizeof ".lock" */
|
if (asprintf(&file, "%s.%ju", db->filename, (uintmax_t) getpid()) == -1)
|
||||||
file = (char*)malloc(file_len);
|
|
||||||
if (file == NULL) {
|
|
||||||
goto cleanup_ENOMEM;
|
goto cleanup_ENOMEM;
|
||||||
}
|
if (asprintf(&lock, "%s.lock", db->filename) == -1)
|
||||||
lock = (char*)malloc(lock_file_len);
|
|
||||||
if (lock == NULL) {
|
|
||||||
goto cleanup_ENOMEM;
|
goto cleanup_ENOMEM;
|
||||||
}
|
|
||||||
snprintf (file, file_len, "%s.%lu",
|
|
||||||
db->filename, (unsigned long) getpid ());
|
|
||||||
snprintf (lock, lock_file_len, "%s.lock", db->filename);
|
|
||||||
if (do_lock_file (file, lock, log) != 0) {
|
if (do_lock_file (file, lock, log) != 0) {
|
||||||
db->locked = true;
|
db->locked = true;
|
||||||
lock_count++;
|
lock_count++;
|
||||||
err = 1;
|
err = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup_ENOMEM:
|
cleanup_ENOMEM:
|
||||||
free(file);
|
free(file);
|
||||||
free(lock);
|
free(lock);
|
||||||
@@ -483,7 +468,7 @@ static void dec_lock_count (void)
|
|||||||
|
|
||||||
int commonio_unlock (struct commonio_db *db)
|
int commonio_unlock (struct commonio_db *db)
|
||||||
{
|
{
|
||||||
char lock[1024];
|
char lock[1029];
|
||||||
|
|
||||||
if (db->isopen) {
|
if (db->isopen) {
|
||||||
db->readonly = true;
|
db->readonly = true;
|
||||||
@@ -500,7 +485,7 @@ int commonio_unlock (struct commonio_db *db)
|
|||||||
* then call ulckpwdf() (if used) on last unlock.
|
* then call ulckpwdf() (if used) on last unlock.
|
||||||
*/
|
*/
|
||||||
db->locked = false;
|
db->locked = false;
|
||||||
snprintf (lock, sizeof lock, "%s.lock", db->filename);
|
SNPRINTF(lock, "%s.lock", db->filename);
|
||||||
unlink (lock);
|
unlink (lock);
|
||||||
dec_lock_count ();
|
dec_lock_count ();
|
||||||
return 1;
|
return 1;
|
||||||
@@ -618,7 +603,7 @@ int commonio_open (struct commonio_db *db, int mode)
|
|||||||
|
|
||||||
fd = open (db->filename,
|
fd = open (db->filename,
|
||||||
(db->readonly ? O_RDONLY : O_RDWR)
|
(db->readonly ? O_RDONLY : O_RDWR)
|
||||||
| O_NOCTTY | O_NONBLOCK | O_NOFOLLOW);
|
| O_NOCTTY | O_NONBLOCK | O_NOFOLLOW | O_CLOEXEC);
|
||||||
saved_errno = errno;
|
saved_errno = errno;
|
||||||
db->fp = NULL;
|
db->fp = NULL;
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
@@ -649,22 +634,19 @@ int commonio_open (struct commonio_db *db, int mode)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do not inherit fd in spawned processes (e.g. nscd) */
|
|
||||||
fcntl (fileno (db->fp), F_SETFD, FD_CLOEXEC);
|
|
||||||
|
|
||||||
buflen = BUFLEN;
|
buflen = BUFLEN;
|
||||||
buf = (char *) malloc (buflen);
|
buf = MALLOC(buflen, char);
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
goto cleanup_ENOMEM;
|
goto cleanup_ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (db->ops->fgets (buf, (int) buflen, db->fp) == buf) {
|
while (db->ops->fgets (buf, buflen, db->fp) == buf) {
|
||||||
while ( ((cp = strrchr (buf, '\n')) == NULL)
|
while ( (strrchr (buf, '\n') == NULL)
|
||||||
&& (feof (db->fp) == 0)) {
|
&& (feof (db->fp) == 0)) {
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
buflen += BUFLEN;
|
buflen += BUFLEN;
|
||||||
cp = (char *) realloc (buf, buflen);
|
cp = REALLOC(buf, buflen, char);
|
||||||
if (NULL == cp) {
|
if (NULL == cp) {
|
||||||
goto cleanup_buf;
|
goto cleanup_buf;
|
||||||
}
|
}
|
||||||
@@ -698,7 +680,7 @@ int commonio_open (struct commonio_db *db, int mode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p = (struct commonio_entry *) malloc (sizeof *p);
|
p = MALLOC(1, struct commonio_entry);
|
||||||
if (NULL == p) {
|
if (NULL == p) {
|
||||||
goto cleanup_entry;
|
goto cleanup_entry;
|
||||||
}
|
}
|
||||||
@@ -775,7 +757,7 @@ commonio_sort (struct commonio_db *db, int (*cmp) (const void *, const void *))
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
entries = malloc (n * sizeof (struct commonio_entry *));
|
entries = MALLOC(n, struct commonio_entry *);
|
||||||
if (entries == NULL) {
|
if (entries == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -912,9 +894,9 @@ static int write_all (const struct commonio_db *db)
|
|||||||
|
|
||||||
int commonio_close (struct commonio_db *db)
|
int commonio_close (struct commonio_db *db)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
int errors = 0;
|
||||||
int errors = 0;
|
char buf[1024];
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
|
|
||||||
if (!db->isopen) {
|
if (!db->isopen) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
@@ -945,7 +927,11 @@ int commonio_close (struct commonio_db *db)
|
|||||||
/*
|
/*
|
||||||
* Create backup file.
|
* Create backup file.
|
||||||
*/
|
*/
|
||||||
snprintf (buf, sizeof buf, "%s-", db->filename);
|
if (SNPRINTF(buf, "%s-", db->filename) == -1) {
|
||||||
|
(void) fclose (db->fp);
|
||||||
|
db->fp = NULL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
if (set_selinux_file_context (db->filename, S_IFREG) != 0) {
|
if (set_selinux_file_context (db->filename, S_IFREG) != 0) {
|
||||||
@@ -960,15 +946,15 @@ int commonio_close (struct commonio_db *db)
|
|||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db->fp = NULL;
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
if (reset_selinux_file_context () != 0) {
|
if (reset_selinux_file_context () != 0) {
|
||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (errors != 0) {
|
if (errors != 0)
|
||||||
db->fp = NULL;
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Default permissions for new [g]shadow files.
|
* Default permissions for new [g]shadow files.
|
||||||
@@ -978,7 +964,8 @@ int commonio_close (struct commonio_db *db)
|
|||||||
sb.st_gid = db->st_gid;
|
sb.st_gid = db->st_gid;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf (buf, sizeof buf, "%s+", db->filename);
|
if (SNPRINTF(buf, "%s+", db->filename) == -1)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
if (set_selinux_file_context (db->filename, S_IFREG) != 0) {
|
if (set_selinux_file_context (db->filename, S_IFREG) != 0) {
|
||||||
@@ -998,13 +985,11 @@ int commonio_close (struct commonio_db *db)
|
|||||||
if (fflush (db->fp) != 0) {
|
if (fflush (db->fp) != 0) {
|
||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_FSYNC
|
|
||||||
if (fsync (fileno (db->fp)) != 0) {
|
if (fsync (fileno (db->fp)) != 0) {
|
||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
#else /* !HAVE_FSYNC */
|
|
||||||
sync ();
|
|
||||||
#endif /* !HAVE_FSYNC */
|
|
||||||
if (fclose (db->fp) != 0) {
|
if (fclose (db->fp) != 0) {
|
||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
@@ -1096,7 +1081,7 @@ int commonio_update (struct commonio_db *db, const void *eptr)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* not found, new entry */
|
/* not found, new entry */
|
||||||
p = (struct commonio_entry *) malloc (sizeof *p);
|
p = MALLOC(1, struct commonio_entry);
|
||||||
if (NULL == p) {
|
if (NULL == p) {
|
||||||
db->ops->free (nentry);
|
db->ops->free (nentry);
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
@@ -1133,7 +1118,7 @@ int commonio_append (struct commonio_db *db, const void *eptr)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* new entry */
|
/* new entry */
|
||||||
p = (struct commonio_entry *) malloc (sizeof *p);
|
p = MALLOC(1, struct commonio_entry);
|
||||||
if (NULL == p) {
|
if (NULL == p) {
|
||||||
db->ops->free (nentry);
|
db->ops->free (nentry);
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
@@ -1200,6 +1185,8 @@ int commonio_remove (struct commonio_db *db, const char *name)
|
|||||||
db->ops->free (p->eptr);
|
db->ops->free (p->eptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(p);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-2
@@ -11,8 +11,11 @@
|
|||||||
#ifndef COMMONIO_H
|
#ifndef COMMONIO_H
|
||||||
#define COMMONIO_H
|
#define COMMONIO_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
#include "defines.h" /* bool */
|
#include "defines.h" /* bool */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Linked list entry.
|
* Linked list entry.
|
||||||
*/
|
*/
|
||||||
@@ -37,7 +40,7 @@ struct commonio_ops {
|
|||||||
/*
|
/*
|
||||||
* free() the object including any strings pointed by it.
|
* free() the object including any strings pointed by it.
|
||||||
*/
|
*/
|
||||||
void (*free) (/*@out@*/ /*@only@*/void *);
|
void (*free)(/*@only@*/void *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the name of the object (for example, pw_name
|
* Return the name of the object (for example, pw_name
|
||||||
@@ -61,7 +64,9 @@ struct commonio_ops {
|
|||||||
* fgets and fputs (can be replaced by versions that
|
* fgets and fputs (can be replaced by versions that
|
||||||
* understand line continuation conventions).
|
* understand line continuation conventions).
|
||||||
*/
|
*/
|
||||||
/*@null@*/char *(*fgets) (/*@returned@*/ /*@out@*/char *s, int n, FILE *stream);
|
ATTR_ACCESS(write_only, 1, 2)
|
||||||
|
/*@null@*/char *(*fgets)(/*@returned@*/char *restrict s, int n,
|
||||||
|
FILE *restrict stream);
|
||||||
int (*fputs) (const char *, FILE *);
|
int (*fputs) (const char *, FILE *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -123,6 +128,7 @@ extern int commonio_setname (struct commonio_db *, const char *);
|
|||||||
extern bool commonio_present (const struct commonio_db *db);
|
extern bool commonio_present (const struct commonio_db *db);
|
||||||
extern int commonio_lock (struct commonio_db *);
|
extern int commonio_lock (struct commonio_db *);
|
||||||
extern int commonio_lock_nowait (struct commonio_db *, bool log);
|
extern int commonio_lock_nowait (struct commonio_db *, bool log);
|
||||||
|
extern int do_fcntl_lock (const char *file, bool log, short type);
|
||||||
extern int commonio_open (struct commonio_db *, int);
|
extern int commonio_open (struct commonio_db *, int);
|
||||||
extern /*@observer@*/ /*@null@*/const void *commonio_locate (struct commonio_db *, const char *);
|
extern /*@observer@*/ /*@null@*/const void *commonio_locate (struct commonio_db *, const char *);
|
||||||
extern int commonio_update (struct commonio_db *, const void *);
|
extern int commonio_update (struct commonio_db *, const void *);
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "getdef.h"
|
#include "getdef.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
|
#include "string/strtcpy.h"
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
@@ -44,8 +45,7 @@ static bool is_listed (const char *cfgin, const char *tty, bool def)
|
|||||||
|
|
||||||
if (*cons != '/') {
|
if (*cons != '/') {
|
||||||
char *pbuf;
|
char *pbuf;
|
||||||
strncpy (buf, cons, sizeof (buf));
|
STRTCPY(buf, cons);
|
||||||
buf[sizeof (buf) - 1] = '\0';
|
|
||||||
pbuf = &buf[0];
|
pbuf = &buf[0];
|
||||||
while ((s = strtok (pbuf, ":")) != NULL) {
|
while ((s = strtok (pbuf, ":")) != NULL) {
|
||||||
if (strcmp (s, tty) == 0) {
|
if (strcmp (s, tty) == 0) {
|
||||||
@@ -71,8 +71,9 @@ static bool is_listed (const char *cfgin, const char *tty, bool def)
|
|||||||
* See if this tty is listed in the console file.
|
* See if this tty is listed in the console file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while (fgets (buf, (int) sizeof (buf), fp) != NULL) {
|
while (fgets (buf, sizeof (buf), fp) != NULL) {
|
||||||
buf[strlen (buf) - 1] = '\0';
|
/* Remove optional trailing '\n'. */
|
||||||
|
buf[strcspn (buf, "\n")] = '\0';
|
||||||
if (strcmp (buf, tty) == 0) {
|
if (strcmp (buf, tty) == 0) {
|
||||||
(void) fclose (fp);
|
(void) fclose (fp);
|
||||||
return true;
|
return true;
|
||||||
+144
-187
@@ -17,6 +17,9 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
|
#include "attr.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
@@ -33,6 +36,7 @@
|
|||||||
#include <attr/libattr.h>
|
#include <attr/libattr.h>
|
||||||
#endif /* WITH_ATTR */
|
#endif /* WITH_ATTR */
|
||||||
#include "shadowlog.h"
|
#include "shadowlog.h"
|
||||||
|
#include "string/sprintf.h"
|
||||||
|
|
||||||
|
|
||||||
static /*@null@*/const char *src_orig;
|
static /*@null@*/const char *src_orig;
|
||||||
@@ -64,12 +68,12 @@ static int copy_dir (const struct path_info *src, const struct path_info *dst,
|
|||||||
gid_t old_gid, gid_t new_gid);
|
gid_t old_gid, gid_t new_gid);
|
||||||
static /*@null@*/char *readlink_malloc (const char *filename);
|
static /*@null@*/char *readlink_malloc (const char *filename);
|
||||||
static int copy_symlink (const struct path_info *src, const struct path_info *dst,
|
static int copy_symlink (const struct path_info *src, const struct path_info *dst,
|
||||||
unused bool reset_selinux,
|
MAYBE_UNUSED bool reset_selinux,
|
||||||
const struct stat *statp, const struct timespec mt[],
|
const struct stat *statp, const struct timespec mt[],
|
||||||
uid_t old_uid, uid_t new_uid,
|
uid_t old_uid, uid_t new_uid,
|
||||||
gid_t old_gid, gid_t new_gid);
|
gid_t old_gid, gid_t new_gid);
|
||||||
static int copy_hardlink (const struct path_info *dst,
|
static int copy_hardlink (const struct path_info *dst,
|
||||||
unused bool reset_selinux,
|
MAYBE_UNUSED bool reset_selinux,
|
||||||
struct link_name *lp);
|
struct link_name *lp);
|
||||||
static int copy_special (const struct path_info *src, const struct path_info *dst,
|
static int copy_special (const struct path_info *src, const struct path_info *dst,
|
||||||
bool reset_selinux,
|
bool reset_selinux,
|
||||||
@@ -93,7 +97,7 @@ static int fchown_if_needed (int fdst, const struct stat *statp,
|
|||||||
* error_acl - format the error messages for the ACL and EQ libraries.
|
* error_acl - format the error messages for the ACL and EQ libraries.
|
||||||
*/
|
*/
|
||||||
format_attr(printf, 2, 3)
|
format_attr(printf, 2, 3)
|
||||||
static void error_acl (unused struct error_context *ctx, const char *fmt, ...)
|
static void error_acl (MAYBE_UNUSED struct error_context *ctx, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
FILE *shadow_logfd = log_get_logfd();
|
FILE *shadow_logfd = log_get_logfd();
|
||||||
@@ -206,11 +210,7 @@ static void remove_link (/*@only@*/struct link_name *ln)
|
|||||||
|
|
||||||
static /*@exposed@*/ /*@null@*/struct link_name *check_link (const char *name, const struct stat *sb)
|
static /*@exposed@*/ /*@null@*/struct link_name *check_link (const char *name, const struct stat *sb)
|
||||||
{
|
{
|
||||||
struct link_name *lp;
|
struct link_name *lp;
|
||||||
size_t src_len;
|
|
||||||
size_t dst_len;
|
|
||||||
size_t name_len;
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
/* copy_tree () must be the entry point */
|
/* copy_tree () must be the entry point */
|
||||||
assert (NULL != src_orig);
|
assert (NULL != src_orig);
|
||||||
@@ -226,16 +226,11 @@ static /*@exposed@*/ /*@null@*/struct link_name *check_link (const char *name, c
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
lp = (struct link_name *) xmalloc (sizeof *lp);
|
lp = XMALLOC(1, struct link_name);
|
||||||
src_len = strlen (src_orig);
|
|
||||||
dst_len = strlen (dst_orig);
|
|
||||||
name_len = strlen (name);
|
|
||||||
lp->ln_dev = sb->st_dev;
|
lp->ln_dev = sb->st_dev;
|
||||||
lp->ln_ino = sb->st_ino;
|
lp->ln_ino = sb->st_ino;
|
||||||
lp->ln_count = sb->st_nlink;
|
lp->ln_count = sb->st_nlink;
|
||||||
len = name_len - src_len + dst_len + 1;
|
xasprintf(&lp->ln_name, "%s%s", dst_orig, name + strlen(src_orig));
|
||||||
lp->ln_name = (char *) xmalloc (len);
|
|
||||||
(void) snprintf (lp->ln_name, len, "%s%s", dst_orig, name + src_len);
|
|
||||||
lp->ln_next = links;
|
lp->ln_next = links;
|
||||||
links = lp;
|
links = lp;
|
||||||
|
|
||||||
@@ -312,51 +307,43 @@ static int copy_tree_impl (const struct path_info *src, const struct path_info *
|
|||||||
set_orig = true;
|
set_orig = true;
|
||||||
}
|
}
|
||||||
while ((0 == err) && (ent = readdir (dir)) != NULL) {
|
while ((0 == err) && (ent = readdir (dir)) != NULL) {
|
||||||
|
char *src_name = NULL;
|
||||||
|
char *dst_name;
|
||||||
|
struct path_info src_entry, dst_entry;
|
||||||
/*
|
/*
|
||||||
* Skip the "." and ".." entries
|
* Skip the "." and ".." entries
|
||||||
*/
|
*/
|
||||||
if ((strcmp (ent->d_name, ".") != 0) &&
|
if (strcmp(ent->d_name, ".") == 0 ||
|
||||||
(strcmp (ent->d_name, "..") != 0)) {
|
strcmp(ent->d_name, "..") == 0)
|
||||||
char *src_name;
|
{
|
||||||
char *dst_name;
|
continue;
|
||||||
size_t src_len = strlen (ent->d_name) + 2;
|
|
||||||
size_t dst_len = strlen (ent->d_name) + 2;
|
|
||||||
src_len += strlen (src->full_path);
|
|
||||||
dst_len += strlen (dst->full_path);
|
|
||||||
|
|
||||||
src_name = (char *) malloc (src_len);
|
|
||||||
dst_name = (char *) malloc (dst_len);
|
|
||||||
|
|
||||||
if ((NULL == src_name) || (NULL == dst_name)) {
|
|
||||||
err = -1;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Build the filename for both the source and
|
|
||||||
* the destination files.
|
|
||||||
*/
|
|
||||||
struct path_info src_entry, dst_entry;
|
|
||||||
|
|
||||||
(void) snprintf (src_name, src_len, "%s/%s",
|
|
||||||
src->full_path, ent->d_name);
|
|
||||||
(void) snprintf (dst_name, dst_len, "%s/%s",
|
|
||||||
dst->full_path, ent->d_name);
|
|
||||||
|
|
||||||
src_entry.full_path = src_name;
|
|
||||||
src_entry.dirfd = dirfd(dir);
|
|
||||||
src_entry.name = ent->d_name;
|
|
||||||
|
|
||||||
dst_entry.full_path = dst_name;
|
|
||||||
dst_entry.dirfd = dst_fd;
|
|
||||||
dst_entry.name = ent->d_name;
|
|
||||||
|
|
||||||
err = copy_entry (&src_entry, &dst_entry,
|
|
||||||
reset_selinux,
|
|
||||||
old_uid, new_uid,
|
|
||||||
old_gid, new_gid);
|
|
||||||
}
|
|
||||||
free (src_name);
|
|
||||||
free (dst_name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (asprintf(&src_name, "%s/%s", src->full_path, ent->d_name) == -1)
|
||||||
|
{
|
||||||
|
err = -1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (asprintf(&dst_name, "%s/%s", dst->full_path, ent->d_name) == -1)
|
||||||
|
{
|
||||||
|
err = -1;
|
||||||
|
goto skip;
|
||||||
|
}
|
||||||
|
|
||||||
|
src_entry.full_path = src_name;
|
||||||
|
src_entry.dirfd = dirfd(dir);
|
||||||
|
src_entry.name = ent->d_name;
|
||||||
|
|
||||||
|
dst_entry.full_path = dst_name;
|
||||||
|
dst_entry.dirfd = dst_fd;
|
||||||
|
dst_entry.name = ent->d_name;
|
||||||
|
|
||||||
|
err = copy_entry(&src_entry, &dst_entry, reset_selinux,
|
||||||
|
old_uid, new_uid, old_gid, new_gid);
|
||||||
|
|
||||||
|
free(dst_name);
|
||||||
|
skip:
|
||||||
|
free(src_name);
|
||||||
}
|
}
|
||||||
(void) closedir (dir);
|
(void) closedir (dir);
|
||||||
(void) close (dst_fd);
|
(void) close (dst_fd);
|
||||||
@@ -413,78 +400,70 @@ static int copy_entry (const struct path_info *src, const struct path_info *dst,
|
|||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
|
struct stat tmp_sb;
|
||||||
struct link_name *lp;
|
struct link_name *lp;
|
||||||
struct timespec mt[2];
|
struct timespec mt[2];
|
||||||
|
|
||||||
if (fstatat(src->dirfd, src->name, &sb, AT_SYMLINK_NOFOLLOW) == -1) {
|
if (fstatat(src->dirfd, src->name, &sb, AT_SYMLINK_NOFOLLOW) == -1) {
|
||||||
/* If we cannot stat the file, do not care. */
|
/* If we cannot stat the file, do not care. */
|
||||||
} else {
|
return 0;
|
||||||
#ifdef HAVE_STRUCT_STAT_ST_ATIM
|
}
|
||||||
mt[0].tv_sec = sb.st_atim.tv_sec;
|
|
||||||
mt[0].tv_nsec = sb.st_atim.tv_nsec;
|
|
||||||
#else /* !HAVE_STRUCT_STAT_ST_ATIM */
|
|
||||||
mt[0].tv_sec = sb.st_atime;
|
|
||||||
# ifdef HAVE_STRUCT_STAT_ST_ATIMENSEC
|
|
||||||
mt[0].tv_nsec = sb.st_atimensec;
|
|
||||||
# else /* !HAVE_STRUCT_STAT_ST_ATIMENSEC */
|
|
||||||
mt[0].tv_nsec = 0;
|
|
||||||
# endif /* !HAVE_STRUCT_STAT_ST_ATIMENSEC */
|
|
||||||
#endif /* !HAVE_STRUCT_STAT_ST_ATIM */
|
|
||||||
|
|
||||||
#ifdef HAVE_STRUCT_STAT_ST_MTIM
|
mt[0].tv_sec = sb.st_atim.tv_sec;
|
||||||
mt[1].tv_sec = sb.st_mtim.tv_sec;
|
mt[0].tv_nsec = sb.st_atim.tv_nsec;
|
||||||
mt[1].tv_nsec = sb.st_mtim.tv_nsec;
|
|
||||||
#else /* !HAVE_STRUCT_STAT_ST_MTIM */
|
|
||||||
mt[1].tv_sec = sb.st_mtime;
|
|
||||||
# ifdef HAVE_STRUCT_STAT_ST_MTIMENSEC
|
|
||||||
mt[1].tv_nsec = sb.st_mtimensec;
|
|
||||||
# else /* !HAVE_STRUCT_STAT_ST_MTIMENSEC */
|
|
||||||
mt[1].tv_nsec = 0;
|
|
||||||
# endif /* !HAVE_STRUCT_STAT_ST_MTIMENSEC */
|
|
||||||
#endif /* !HAVE_STRUCT_STAT_ST_MTIM */
|
|
||||||
|
|
||||||
if (S_ISDIR (sb.st_mode)) {
|
mt[1].tv_sec = sb.st_mtim.tv_sec;
|
||||||
err = copy_dir (src, dst, reset_selinux, &sb, mt,
|
mt[1].tv_nsec = sb.st_mtim.tv_nsec;
|
||||||
old_uid, new_uid, old_gid, new_gid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
if (S_ISDIR (sb.st_mode)) {
|
||||||
* Copy any symbolic links
|
err = copy_dir (src, dst, reset_selinux, &sb, mt,
|
||||||
*/
|
old_uid, new_uid, old_gid, new_gid);
|
||||||
|
}
|
||||||
|
|
||||||
else if (S_ISLNK (sb.st_mode)) {
|
/*
|
||||||
err = copy_symlink (src, dst, reset_selinux, &sb, mt,
|
* If the destination already exists do nothing.
|
||||||
old_uid, new_uid, old_gid, new_gid);
|
* This is after the copy_dir above to still iterate into subdirectories.
|
||||||
}
|
*/
|
||||||
|
if (fstatat(dst->dirfd, dst->name, &tmp_sb, AT_SYMLINK_NOFOLLOW) != -1) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See if this is a previously copied link
|
* Copy any symbolic links
|
||||||
*/
|
*/
|
||||||
|
|
||||||
else if ((lp = check_link (src->full_path, &sb)) != NULL) {
|
else if (S_ISLNK (sb.st_mode)) {
|
||||||
err = copy_hardlink (dst, reset_selinux, lp);
|
err = copy_symlink (src, dst, reset_selinux, &sb, mt,
|
||||||
}
|
old_uid, new_uid, old_gid, new_gid);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Deal with FIFOs and special files. The user really
|
* See if this is a previously copied link
|
||||||
* shouldn't have any of these, but it seems like it
|
*/
|
||||||
* would be nice to copy everything ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
else if (!S_ISREG (sb.st_mode)) {
|
else if ((lp = check_link (src->full_path, &sb)) != NULL) {
|
||||||
err = copy_special (src, dst, reset_selinux, &sb, mt,
|
err = copy_hardlink (dst, reset_selinux, lp);
|
||||||
old_uid, new_uid, old_gid, new_gid);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the new file and copy the contents. The new
|
* Deal with FIFOs and special files. The user really
|
||||||
* file will be owned by the provided UID and GID values.
|
* shouldn't have any of these, but it seems like it
|
||||||
*/
|
* would be nice to copy everything ...
|
||||||
|
*/
|
||||||
|
|
||||||
else {
|
else if (!S_ISREG (sb.st_mode)) {
|
||||||
err = copy_file (src, dst, reset_selinux, &sb, mt,
|
err = copy_special (src, dst, reset_selinux, &sb, mt,
|
||||||
old_uid, new_uid, old_gid, new_gid);
|
old_uid, new_uid, old_gid, new_gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the new file and copy the contents. The new
|
||||||
|
* file will be owned by the provided UID and GID values.
|
||||||
|
*/
|
||||||
|
|
||||||
|
else {
|
||||||
|
err = copy_file (src, dst, reset_selinux, &sb, mt,
|
||||||
|
old_uid, new_uid, old_gid, new_gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
@@ -507,6 +486,7 @@ static int copy_dir (const struct path_info *src, const struct path_info *dst,
|
|||||||
gid_t old_gid, gid_t new_gid)
|
gid_t old_gid, gid_t new_gid)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
struct stat dst_sb;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a new target directory, make it owned by
|
* Create a new target directory, make it owned by
|
||||||
@@ -518,6 +498,15 @@ static int copy_dir (const struct path_info *src, const struct path_info *dst,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif /* WITH_SELINUX */
|
#endif /* WITH_SELINUX */
|
||||||
|
/*
|
||||||
|
* If the destination is already a directory, don't change it
|
||||||
|
* but copy into it (recursively).
|
||||||
|
*/
|
||||||
|
if (fstatat(dst->dirfd, dst->name, &dst_sb, AT_SYMLINK_NOFOLLOW) == 0 && S_ISDIR(dst_sb.st_mode)) {
|
||||||
|
return (copy_tree_impl (src, dst, false, reset_selinux,
|
||||||
|
old_uid, new_uid, old_gid, new_gid) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
if ( (mkdirat (dst->dirfd, dst->name, 0700) != 0)
|
if ( (mkdirat (dst->dirfd, dst->name, 0700) != 0)
|
||||||
|| (chownat_if_needed (dst, statp,
|
|| (chownat_if_needed (dst, statp,
|
||||||
old_uid, new_uid, old_gid, new_gid) != 0)
|
old_uid, new_uid, old_gid, new_gid) != 0)
|
||||||
@@ -559,7 +548,7 @@ static /*@null@*/char *readlink_malloc (const char *filename)
|
|||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
ssize_t nchars;
|
ssize_t nchars;
|
||||||
char *buffer = (char *) malloc (size);
|
char *buffer = MALLOC(size, char);
|
||||||
if (NULL == buffer) {
|
if (NULL == buffer) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -594,7 +583,7 @@ static /*@null@*/char *readlink_malloc (const char *filename)
|
|||||||
* Return 0 on success, -1 on error.
|
* Return 0 on success, -1 on error.
|
||||||
*/
|
*/
|
||||||
static int copy_symlink (const struct path_info *src, const struct path_info *dst,
|
static int copy_symlink (const struct path_info *src, const struct path_info *dst,
|
||||||
unused bool reset_selinux,
|
MAYBE_UNUSED bool reset_selinux,
|
||||||
const struct stat *statp, const struct timespec mt[],
|
const struct stat *statp, const struct timespec mt[],
|
||||||
uid_t old_uid, uid_t new_uid,
|
uid_t old_uid, uid_t new_uid,
|
||||||
gid_t old_gid, gid_t new_gid)
|
gid_t old_gid, gid_t new_gid)
|
||||||
@@ -622,13 +611,11 @@ static int copy_symlink (const struct path_info *src, const struct path_info *ds
|
|||||||
* create a link to the corresponding entry in the dst_orig
|
* create a link to the corresponding entry in the dst_orig
|
||||||
* directory.
|
* directory.
|
||||||
*/
|
*/
|
||||||
if (strncmp (oldlink, src_orig, strlen (src_orig)) == 0) {
|
if (strncmp(oldlink, src_orig, strlen(src_orig)) == 0) {
|
||||||
size_t len = strlen (dst_orig) + strlen (oldlink) - strlen (src_orig) + 1;
|
char *dummy;
|
||||||
char *dummy = (char *) xmalloc (len);
|
|
||||||
(void) snprintf (dummy, len, "%s%s",
|
xasprintf(&dummy, "%s%s", dst_orig, oldlink + strlen(src_orig));
|
||||||
dst_orig,
|
free(oldlink);
|
||||||
oldlink + strlen (src_orig));
|
|
||||||
free (oldlink);
|
|
||||||
oldlink = dummy;
|
oldlink = dummy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -668,7 +655,7 @@ static int copy_symlink (const struct path_info *src, const struct path_info *ds
|
|||||||
* Return 0 on success, -1 on error.
|
* Return 0 on success, -1 on error.
|
||||||
*/
|
*/
|
||||||
static int copy_hardlink (const struct path_info *dst,
|
static int copy_hardlink (const struct path_info *dst,
|
||||||
unused bool reset_selinux,
|
MAYBE_UNUSED bool reset_selinux,
|
||||||
struct link_name *lp)
|
struct link_name *lp)
|
||||||
{
|
{
|
||||||
/* FIXME: selinux, ACL, Extended Attributes needed? */
|
/* FIXME: selinux, ACL, Extended Attributes needed? */
|
||||||
@@ -687,6 +674,7 @@ static int copy_hardlink (const struct path_info *dst,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* copy_special - copy a special file
|
* copy_special - copy a special file
|
||||||
*
|
*
|
||||||
@@ -697,29 +685,33 @@ static int copy_hardlink (const struct path_info *dst,
|
|||||||
*
|
*
|
||||||
* Return 0 on success, -1 on error.
|
* Return 0 on success, -1 on error.
|
||||||
*/
|
*/
|
||||||
static int copy_special (const struct path_info *src, const struct path_info *dst,
|
static int
|
||||||
bool reset_selinux,
|
copy_special(const struct path_info *src, const struct path_info *dst,
|
||||||
const struct stat *statp, const struct timespec mt[],
|
bool reset_selinux,
|
||||||
uid_t old_uid, uid_t new_uid,
|
const struct stat *statp, const struct timespec mt[],
|
||||||
gid_t old_gid, gid_t new_gid)
|
uid_t old_uid, uid_t new_uid,
|
||||||
|
gid_t old_gid, gid_t new_gid)
|
||||||
{
|
{
|
||||||
int err = 0;
|
#if defined(WITH_SELINUX)
|
||||||
|
if (set_selinux_file_context(dst->full_path, statp->st_mode & S_IFMT) != 0)
|
||||||
#ifdef WITH_SELINUX
|
|
||||||
if (set_selinux_file_context (dst->full_path, statp->st_mode & S_IFMT) != 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
#endif
|
||||||
#endif /* WITH_SELINUX */
|
|
||||||
|
|
||||||
if ( (mknodat (dst->dirfd, dst->name, statp->st_mode & ~07777U, statp->st_rdev) != 0)
|
if (mknodat(dst->dirfd, dst->name, statp->st_mode & ~07777U, statp->st_rdev) == -1)
|
||||||
|| (chownat_if_needed (dst, statp,
|
return -1;
|
||||||
old_uid, new_uid, old_gid, new_gid) != 0)
|
|
||||||
|| (fchmodat (dst->dirfd, dst->name, statp->st_mode & 07777, AT_SYMLINK_NOFOLLOW) != 0)
|
if (chownat_if_needed(dst, statp, old_uid, new_uid, old_gid, new_gid) == -1)
|
||||||
#ifdef WITH_ACL
|
return -1;
|
||||||
|| ( (perm_copy_path (src, dst, &ctx) != 0)
|
|
||||||
&& (errno != 0))
|
if (fchmodat(dst->dirfd, dst->name, statp->st_mode & 07777, AT_SYMLINK_NOFOLLOW) == -1)
|
||||||
#endif /* WITH_ACL */
|
return -1;
|
||||||
#ifdef WITH_ATTR
|
|
||||||
|
#if defined(WITH_ACL)
|
||||||
|
if (perm_copy_path(src, dst, &ctx) == -1 && errno != 0)
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WITH_ATTR)
|
||||||
/*
|
/*
|
||||||
* If the third parameter is NULL, all extended attributes
|
* If the third parameter is NULL, all extended attributes
|
||||||
* except those that define Access Control Lists are copied.
|
* except those that define Access Control Lists are copied.
|
||||||
@@ -727,51 +719,16 @@ static int copy_special (const struct path_info *src, const struct path_info *ds
|
|||||||
* file systems with and without ACL support needs some
|
* file systems with and without ACL support needs some
|
||||||
* additional logic so that no unexpected permissions result.
|
* additional logic so that no unexpected permissions result.
|
||||||
*/
|
*/
|
||||||
|| ( !reset_selinux
|
if (!reset_selinux) {
|
||||||
&& (attr_copy_path (src, dst, NULL, &ctx) != 0)
|
if (attr_copy_path(src, dst, NULL, &ctx) == -1 && errno != 0)
|
||||||
&& (errno != 0))
|
return -1;
|
||||||
#endif /* WITH_ATTR */
|
|
||||||
|| (utimensat (dst->dirfd, dst->name, mt, AT_SYMLINK_NOFOLLOW) != 0)) {
|
|
||||||
err = -1;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return err;
|
if (utimensat(dst->dirfd, dst->name, mt, AT_SYMLINK_NOFOLLOW) == -1)
|
||||||
}
|
return -1;
|
||||||
|
|
||||||
/*
|
return 0;
|
||||||
* full_write - write entire buffer
|
|
||||||
*
|
|
||||||
* Write up to count bytes from the buffer starting at buf to the
|
|
||||||
* file referred to by the file descriptor fd.
|
|
||||||
* Retry in case of a short write.
|
|
||||||
*
|
|
||||||
* Returns the number of bytes written on success, -1 on error.
|
|
||||||
*/
|
|
||||||
static ssize_t full_write(int fd, const void *buf, size_t count) {
|
|
||||||
ssize_t written = 0;
|
|
||||||
|
|
||||||
while (count > 0) {
|
|
||||||
ssize_t res;
|
|
||||||
|
|
||||||
res = write(fd, buf, count);
|
|
||||||
if (res < 0) {
|
|
||||||
if (errno == EINTR) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
written += res;
|
|
||||||
buf = (const unsigned char*)buf + res;
|
|
||||||
count -= (size_t)res;
|
|
||||||
}
|
|
||||||
|
|
||||||
return written;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -850,7 +807,7 @@ static int copy_file (const struct path_info *src, const struct path_info *dst,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (full_write (ofd, buf, (size_t)cnt) < 0) {
|
if (write_full(ofd, buf, cnt) == -1) {
|
||||||
(void) close (ofd);
|
(void) close (ofd);
|
||||||
(void) close (ifd);
|
(void) close (ifd);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -858,7 +815,7 @@ static int copy_file (const struct path_info *src, const struct path_info *dst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
(void) close (ifd);
|
(void) close (ifd);
|
||||||
if (close (ofd) != 0) {
|
if (close (ofd) != 0 && errno != EINTR) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
+150
@@ -0,0 +1,150 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: Alejandro Colomar <alx@kernel.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#ident "$Id$"
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#if HAVE_SYS_RANDOM_H
|
||||||
|
#include <sys/random.h>
|
||||||
|
#endif
|
||||||
|
#include "bit.h"
|
||||||
|
#include "defines.h"
|
||||||
|
#include "prototypes.h"
|
||||||
|
#include "shadowlog.h"
|
||||||
|
#include "sizeof.h"
|
||||||
|
|
||||||
|
|
||||||
|
static uint32_t csrand32(void);
|
||||||
|
static uint32_t csrand_uniform32(uint32_t n);
|
||||||
|
static unsigned long csrand_uniform_slow(unsigned long n);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return a uniformly-distributed CS random u_long value.
|
||||||
|
*/
|
||||||
|
unsigned long
|
||||||
|
csrand(void)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
unsigned long r;
|
||||||
|
|
||||||
|
#ifdef HAVE_GETENTROPY
|
||||||
|
/* getentropy may exist but lack kernel support. */
|
||||||
|
if (getentropy(&r, sizeof(r)) == 0)
|
||||||
|
return r;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_GETRANDOM
|
||||||
|
/* Likewise getrandom. */
|
||||||
|
if (getrandom(&r, sizeof(r), 0) == sizeof(r))
|
||||||
|
return r;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_ARC4RANDOM_BUF
|
||||||
|
/* arc4random_buf can never fail. */
|
||||||
|
arc4random_buf(&r, sizeof(r));
|
||||||
|
return r;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Use /dev/urandom as a last resort. */
|
||||||
|
fp = fopen("/dev/urandom", "r");
|
||||||
|
if (NULL == fp) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fread(&r, sizeof(r), 1, fp) != 1) {
|
||||||
|
fclose(fp);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return r;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
fprintf(log_get_logfd(), _("Unable to obtain random bytes.\n"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return a uniformly-distributed CS random value in the interval [0, n-1].
|
||||||
|
*/
|
||||||
|
unsigned long
|
||||||
|
csrand_uniform(unsigned long n)
|
||||||
|
{
|
||||||
|
if (n == 0 || n > UINT32_MAX)
|
||||||
|
return csrand_uniform_slow(n);
|
||||||
|
|
||||||
|
return csrand_uniform32(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return a uniformly-distributed CS random value in the interval [min, max].
|
||||||
|
*/
|
||||||
|
unsigned long
|
||||||
|
csrand_interval(unsigned long min, unsigned long max)
|
||||||
|
{
|
||||||
|
return csrand_uniform(max - min + 1) + min;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static uint32_t
|
||||||
|
csrand32(void)
|
||||||
|
{
|
||||||
|
return csrand();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fast Random Integer Generation in an Interval
|
||||||
|
* ACM Transactions on Modeling and Computer Simulation 29 (1), 2019
|
||||||
|
* <https://arxiv.org/abs/1805.10941>
|
||||||
|
*/
|
||||||
|
static uint32_t
|
||||||
|
csrand_uniform32(uint32_t n)
|
||||||
|
{
|
||||||
|
uint32_t bound, rem;
|
||||||
|
uint64_t r, mult;
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
return csrand32();
|
||||||
|
|
||||||
|
bound = -n % n; // analogous to `2^32 % n`, since `x % y == (x-y) % y`
|
||||||
|
|
||||||
|
do {
|
||||||
|
r = csrand32();
|
||||||
|
mult = r * n;
|
||||||
|
rem = mult; // analogous to `mult % 2^32`
|
||||||
|
} while (rem < bound); // p = (2^32 % n) / 2^32; W.C.: n=2^31+1, p=0.5
|
||||||
|
|
||||||
|
r = mult >> WIDTHOF(n); // analogous to `mult / 2^32`
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned long
|
||||||
|
csrand_uniform_slow(unsigned long n)
|
||||||
|
{
|
||||||
|
unsigned long r, max, mask;
|
||||||
|
|
||||||
|
max = n - 1;
|
||||||
|
mask = bit_ceil_wrapul(n) - 1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
r = csrand();
|
||||||
|
r &= mask; // optimization
|
||||||
|
} while (r > max); // p = ((mask+1) % n) / (mask+1); W.C.: p=0.5
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
+30
-153
@@ -6,41 +6,8 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#if HAVE_STDBOOL_H
|
#include <stdbool.h>
|
||||||
# include <stdbool.h>
|
#include <locale.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
|
|
||||||
|
|
||||||
/* 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_noop(String) (String)
|
||||||
/* #define gettext_def(String) "#define String" */
|
/* #define gettext_def(String) "#define String" */
|
||||||
@@ -57,22 +24,18 @@ extern char * textdomain (const char * domainname);
|
|||||||
# define ngettext(Msgid1, Msgid2, N) \
|
# define ngettext(Msgid1, Msgid2, N) \
|
||||||
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if HAVE_ERRNO_H
|
#include <errno.h>
|
||||||
# include <errno.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#if HAVE_UNISTD_H
|
#include <unistd.h>
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* crypt(3), crypt_gensalt(3), and their
|
* crypt(3), crypt_gensalt(3), and their
|
||||||
@@ -85,22 +48,6 @@ extern char * textdomain (const char * domainname);
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#ifdef HAVE_MEMSET_S
|
|
||||||
# define memzero(ptr, size) memset_s((ptr), 0, (size))
|
|
||||||
#elif defined HAVE_EXPLICIT_BZERO /* !HAVE_MEMSET_S */
|
|
||||||
# define memzero(ptr, size) explicit_bzero((ptr), (size))
|
|
||||||
#else /* !HAVE_MEMSET_S && HAVE_EXPLICIT_BZERO */
|
|
||||||
static inline void memzero(void *ptr, size_t size)
|
|
||||||
{
|
|
||||||
volatile unsigned char * volatile p = ptr;
|
|
||||||
while (size--) {
|
|
||||||
*p++ = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* !HAVE_MEMSET_S && !HAVE_EXPLICIT_BZERO */
|
|
||||||
|
|
||||||
#define strzero(s) memzero(s, strlen(s)) /* warning: evaluates twice */
|
|
||||||
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -123,7 +70,6 @@ static inline void memzero(void *ptr, size_t size)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
|
||||||
#ifndef LOG_WARN
|
#ifndef LOG_WARN
|
||||||
@@ -170,14 +116,6 @@ static inline void memzero(void *ptr, size_t size)
|
|||||||
#define SYSLOG(x) syslog x
|
#define SYSLOG(x) syslog x
|
||||||
#endif /* !ENABLE_NLS */
|
#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,
|
/* The default syslog settings can now be changed here,
|
||||||
in just one place. */
|
in just one place. */
|
||||||
|
|
||||||
@@ -192,63 +130,25 @@ static inline void memzero(void *ptr, size_t size)
|
|||||||
|
|
||||||
#define OPENLOG(progname) openlog(progname, SYSLOG_OPTIONS, SYSLOG_FACILITY)
|
#define OPENLOG(progname) openlog(progname, SYSLOG_OPTIONS, SYSLOG_FACILITY)
|
||||||
|
|
||||||
#ifndef F_OK
|
#include <termios.h>
|
||||||
# define F_OK 0
|
#define STTY(fd, termio) tcsetattr(fd, TCSANOW, termio)
|
||||||
# define X_OK 1
|
#define GTTY(fd, termio) tcgetattr(fd, termio)
|
||||||
# define W_OK 2
|
#define TERMIO struct termios
|
||||||
# define R_OK 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SEEK_SET
|
|
||||||
# define SEEK_SET 0
|
|
||||||
# define SEEK_CUR 1
|
|
||||||
# define SEEK_END 2
|
|
||||||
#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
|
* Password aging constants
|
||||||
*
|
*
|
||||||
* DAY - seconds / day
|
* DAY - seconds / day
|
||||||
* WEEK - seconds / week
|
* WEEK - seconds / week
|
||||||
* SCALE - seconds / aging unit
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Solaris defines this in shadow.h */
|
/* Solaris defines this in shadow.h */
|
||||||
#ifndef DAY
|
#ifndef DAY
|
||||||
#define DAY (24L*3600L)
|
#define DAY ((time_t) 24 * 3600)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define WEEK (7*DAY)
|
#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
|
#ifndef PASSWD_FILE
|
||||||
#define PASSWD_FILE "/etc/passwd"
|
#define PASSWD_FILE "/etc/passwd"
|
||||||
#endif
|
#endif
|
||||||
@@ -261,24 +161,20 @@ static inline void memzero(void *ptr, size_t size)
|
|||||||
#define SHADOW_FILE "/etc/shadow"
|
#define SHADOW_FILE "/etc/shadow"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef SUBUID_FILE
|
||||||
|
#define SUBUID_FILE "/etc/subuid"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SUBGID_FILE
|
||||||
|
#define SUBGID_FILE "/etc/subgid"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SHADOWGRP
|
#ifdef SHADOWGRP
|
||||||
#ifndef SGROUP_FILE
|
#ifndef SGROUP_FILE
|
||||||
#define SGROUP_FILE "/etc/gshadow"
|
#define SGROUP_FILE "/etc/gshadow"
|
||||||
#endif
|
#endif
|
||||||
#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
|
* string to use for the pw_passwd field in /etc/passwd when using
|
||||||
* shadow passwords - most systems use "x" but there are a few
|
* shadow passwords - most systems use "x" but there are a few
|
||||||
@@ -288,45 +184,16 @@ extern char *strerror ();
|
|||||||
#define SHADOW_PASSWD_STRING "x"
|
#define SHADOW_PASSWD_STRING "x"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SHADOW_SP_FLAG_UNSET ((unsigned long int)-1)
|
#define SHADOW_SP_FLAG_UNSET ((unsigned long)-1)
|
||||||
|
|
||||||
#ifdef WITH_AUDIT
|
#ifdef WITH_AUDIT
|
||||||
#ifdef __u8 /* in case we use pam < 0.80 */
|
/* in case we use pam < 0.80 */
|
||||||
#undef __u8
|
#undef __u8
|
||||||
#endif
|
|
||||||
#ifdef __u32
|
|
||||||
#undef __u32
|
#undef __u32
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <libaudit.h>
|
#include <libaudit.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* To be used for verified unused parameters */
|
|
||||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
|
||||||
# define unused __attribute__((unused))
|
|
||||||
# define format_attr(type, index, check) __attribute__((format (type, index, check)))
|
|
||||||
#else
|
|
||||||
# define unused
|
|
||||||
# define format_attr(type, index, check)
|
|
||||||
#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
|
|
||||||
|
|
||||||
/* Maximum length of passwd entry */
|
/* Maximum length of passwd entry */
|
||||||
#define PASSWD_ENTRY_MAX_LENGTH 32768
|
#define PASSWD_ENTRY_MAX_LENGTH 32768
|
||||||
|
|
||||||
@@ -336,4 +203,14 @@ extern char *strerror ();
|
|||||||
# define shadow_getenv(name) getenv(name)
|
# define shadow_getenv(name) getenv(name)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum password length
|
||||||
|
*
|
||||||
|
* Consider that there is also limit in PAM (PAM_MAX_RESP_SIZE)
|
||||||
|
* currently set to 512.
|
||||||
|
*/
|
||||||
|
#if !defined(PASS_MAX)
|
||||||
|
#define PASS_MAX BUFSIZ - 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _DEFINES_H_ */
|
#endif /* _DEFINES_H_ */
|
||||||
|
|||||||
+28
-45
@@ -15,9 +15,14 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "shadowlog.h"
|
#include "shadowlog.h"
|
||||||
|
#include "string/sprintf.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NEWENVP_STEP must be a power of two. This is the number
|
* NEWENVP_STEP must be a power of two. This is the number
|
||||||
* of (char *) pointers to allocate at a time, to avoid using
|
* of (char *) pointers to allocate at a time, to avoid using
|
||||||
@@ -26,7 +31,6 @@
|
|||||||
#define NEWENVP_STEP 16
|
#define NEWENVP_STEP 16
|
||||||
size_t newenvc = 0;
|
size_t newenvc = 0;
|
||||||
/*@null@*/char **newenvp = NULL;
|
/*@null@*/char **newenvp = NULL;
|
||||||
extern char **environ;
|
|
||||||
|
|
||||||
static const char *const forbid[] = {
|
static const char *const forbid[] = {
|
||||||
"_RLD_=",
|
"_RLD_=",
|
||||||
@@ -42,7 +46,7 @@ static const char *const forbid[] = {
|
|||||||
"PATH=",
|
"PATH=",
|
||||||
"SHELL=",
|
"SHELL=",
|
||||||
"SHLIB_PATH=",
|
"SHLIB_PATH=",
|
||||||
(char *) 0
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
/* these are allowed, but with no slashes inside
|
/* these are allowed, but with no slashes inside
|
||||||
@@ -51,7 +55,7 @@ static const char *const noslash[] = {
|
|||||||
"LANG=",
|
"LANG=",
|
||||||
"LANGUAGE=",
|
"LANGUAGE=",
|
||||||
"LC_", /* anything with the LC_ prefix */
|
"LC_", /* anything with the LC_ prefix */
|
||||||
(char *) 0
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -59,23 +63,18 @@ static const char *const noslash[] = {
|
|||||||
*/
|
*/
|
||||||
void initenv (void)
|
void initenv (void)
|
||||||
{
|
{
|
||||||
newenvp = (char **) xmalloc (NEWENVP_STEP * sizeof (char *));
|
newenvp = XMALLOC(NEWENVP_STEP, char *);
|
||||||
*newenvp = NULL;
|
*newenvp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void addenv (const char *string, /*@null@*/const char *value)
|
void addenv (const char *string, /*@null@*/const char *value)
|
||||||
{
|
{
|
||||||
char *cp, *newstring;
|
char *cp, *newstring;
|
||||||
size_t i;
|
size_t i, n;
|
||||||
size_t n;
|
|
||||||
|
|
||||||
if (NULL != value) {
|
if (NULL != value) {
|
||||||
size_t len = strlen (string) + strlen (value) + 2;
|
xasprintf(&newstring, "%s=%s", string, value);
|
||||||
int wlen;
|
|
||||||
newstring = xmalloc (len);
|
|
||||||
wlen = snprintf (newstring, len, "%s=%s", string, value);
|
|
||||||
assert (wlen == (int) len -1);
|
|
||||||
} else {
|
} else {
|
||||||
newstring = xstrdup (string);
|
newstring = xstrdup (string);
|
||||||
}
|
}
|
||||||
@@ -87,7 +86,7 @@ void addenv (const char *string, /*@null@*/const char *value)
|
|||||||
|
|
||||||
cp = strchr (newstring, '=');
|
cp = strchr (newstring, '=');
|
||||||
if (NULL == cp) {
|
if (NULL == cp) {
|
||||||
free (newstring);
|
free(newstring);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +103,7 @@ void addenv (const char *string, /*@null@*/const char *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (i < newenvc) {
|
if (i < newenvc) {
|
||||||
free (newenvp[i]);
|
free(newenvp[i]);
|
||||||
newenvp[i] = newstring;
|
newenvp[i] = newstring;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -127,32 +126,19 @@ void addenv (const char *string, /*@null@*/const char *value)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((newenvc & (NEWENVP_STEP - 1)) == 0) {
|
if ((newenvc & (NEWENVP_STEP - 1)) == 0) {
|
||||||
char **__newenvp;
|
bool update_environ;
|
||||||
size_t newsize;
|
|
||||||
|
update_environ = (environ == newenvp);
|
||||||
|
|
||||||
|
newenvp = XREALLOC(newenvp, newenvc + NEWENVP_STEP, char *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the resize operation succeeds we can
|
* If this is our current environment, update
|
||||||
* happily go on, else print a message.
|
* environ so that it doesn't point to some
|
||||||
|
* free memory area (realloc() could move it).
|
||||||
*/
|
*/
|
||||||
|
if (update_environ)
|
||||||
newsize = (newenvc + NEWENVP_STEP) * sizeof (char *);
|
environ = newenvp;
|
||||||
__newenvp = (char **) realloc (newenvp, newsize);
|
|
||||||
|
|
||||||
if (NULL != __newenvp) {
|
|
||||||
/*
|
|
||||||
* If this is our current environment, update
|
|
||||||
* environ so that it doesn't point to some
|
|
||||||
* free memory area (realloc() could move it).
|
|
||||||
*/
|
|
||||||
if (environ == newenvp) {
|
|
||||||
environ = __newenvp;
|
|
||||||
}
|
|
||||||
newenvp = __newenvp;
|
|
||||||
} else {
|
|
||||||
(void) fputs (_("Environment overflow\n"), log_get_logfd());
|
|
||||||
newenvc--;
|
|
||||||
free (newenvp[newenvc]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -168,9 +154,9 @@ void addenv (const char *string, /*@null@*/const char *value)
|
|||||||
*/
|
*/
|
||||||
void set_env (int argc, char *const *argv)
|
void set_env (int argc, char *const *argv)
|
||||||
{
|
{
|
||||||
int noname = 1;
|
int noname = 1;
|
||||||
char variable[1024];
|
char variable[1024];
|
||||||
char *cp;
|
char *cp;
|
||||||
|
|
||||||
for (; argc > 0; argc--, argv++) {
|
for (; argc > 0; argc--, argv++) {
|
||||||
if (strlen (*argv) >= sizeof variable) {
|
if (strlen (*argv) >= sizeof variable) {
|
||||||
@@ -179,9 +165,7 @@ void set_env (int argc, char *const *argv)
|
|||||||
|
|
||||||
cp = strchr (*argv, '=');
|
cp = strchr (*argv, '=');
|
||||||
if (NULL == cp) {
|
if (NULL == cp) {
|
||||||
int wlen;
|
assert(SNPRINTF(variable, "L%d", noname) != -1);
|
||||||
wlen = snprintf (variable, sizeof variable, "L%d", noname);
|
|
||||||
assert (wlen < (int) sizeof(variable));
|
|
||||||
noname++;
|
noname++;
|
||||||
addenv (variable, *argv);
|
addenv (variable, *argv);
|
||||||
} else {
|
} else {
|
||||||
@@ -194,8 +178,7 @@ void set_env (int argc, char *const *argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (NULL != *p) {
|
if (NULL != *p) {
|
||||||
strncpy (variable, *argv, (size_t)(cp - *argv));
|
stpcpy(mempcpy(variable, *argv, (size_t)(cp - *argv)), "");
|
||||||
variable[cp - *argv] = '\0';
|
|
||||||
printf (_("You may not change $%s\n"),
|
printf (_("You may not change $%s\n"),
|
||||||
variable);
|
variable);
|
||||||
continue;
|
continue;
|
||||||
@@ -14,10 +14,16 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "faillog.h"
|
#include "faillog.h"
|
||||||
#include "getdef.h"
|
|
||||||
#include "failure.h"
|
#include "failure.h"
|
||||||
|
#include "memzero.h"
|
||||||
|
#include "prototypes.h"
|
||||||
|
#include "string/strftime.h"
|
||||||
|
#include "string/strtcpy.h"
|
||||||
|
|
||||||
|
|
||||||
#define YEAR (365L*DAY)
|
#define YEAR (365L*DAY)
|
||||||
/*
|
/*
|
||||||
* failure - make failure entry
|
* failure - make failure entry
|
||||||
@@ -41,7 +47,7 @@ void failure (uid_t uid, const char *tty, struct faillog *fl)
|
|||||||
fd = open (FAILLOG_FILE, O_RDWR);
|
fd = open (FAILLOG_FILE, O_RDWR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
SYSLOG ((LOG_WARN,
|
SYSLOG ((LOG_WARN,
|
||||||
"Can't write faillog entry for UID %lu in %s.",
|
"Can't write faillog entry for UID %lu in %s: %m",
|
||||||
(unsigned long) uid, FAILLOG_FILE));
|
(unsigned long) uid, FAILLOG_FILE));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -53,7 +59,7 @@ void failure (uid_t uid, const char *tty, struct faillog *fl)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|
if ( (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|
||||||
|| (read (fd, (char *) fl, sizeof *fl) != (ssize_t) sizeof *fl)) {
|
|| (read (fd, fl, sizeof *fl) != (ssize_t) sizeof *fl)) {
|
||||||
/* This is not necessarily a failure. The file is
|
/* This is not necessarily a failure. The file is
|
||||||
* initially zero length.
|
* initially zero length.
|
||||||
*
|
*
|
||||||
@@ -75,7 +81,7 @@ void failure (uid_t uid, const char *tty, struct faillog *fl)
|
|||||||
fl->fail_cnt++;
|
fl->fail_cnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy (fl->fail_line, tty, sizeof (fl->fail_line) - 1);
|
STRTCPY(fl->fail_line, tty);
|
||||||
(void) time (&fl->fail_time);
|
(void) time (&fl->fail_time);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -86,13 +92,26 @@ void failure (uid_t uid, const char *tty, struct faillog *fl)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|
if ( (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|
||||||
|| (write (fd, (char *) fl, sizeof *fl) != (ssize_t) sizeof *fl)
|
|| (write_full(fd, fl, sizeof *fl) == -1)) {
|
||||||
|| (close (fd) != 0)) {
|
goto err_write;
|
||||||
SYSLOG ((LOG_WARN,
|
|
||||||
"Can't write faillog entry for UID %lu in %s.",
|
|
||||||
(unsigned long) uid, FAILLOG_FILE));
|
|
||||||
(void) close (fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (close (fd) != 0 && errno != EINTR) {
|
||||||
|
goto err_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
err_write:
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
(void) close (fd);
|
||||||
|
errno = saved_errno;
|
||||||
|
}
|
||||||
|
err_close:
|
||||||
|
SYSLOG ((LOG_WARN,
|
||||||
|
"Can't write faillog entry for UID %lu to %s: %m",
|
||||||
|
(unsigned long) uid, FAILLOG_FILE));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool too_many_failures (const struct faillog *fl)
|
static bool too_many_failures (const struct faillog *fl)
|
||||||
@@ -144,7 +163,7 @@ int failcheck (uid_t uid, struct faillog *fl, bool failed)
|
|||||||
fd = open (FAILLOG_FILE, failed?O_RDONLY:O_RDWR);
|
fd = open (FAILLOG_FILE, failed?O_RDONLY:O_RDWR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
SYSLOG ((LOG_WARN,
|
SYSLOG ((LOG_WARN,
|
||||||
"Can't open the faillog file (%s) to check UID %lu. "
|
"Can't open the faillog file (%s) to check UID %lu: %m; "
|
||||||
"User access authorized.",
|
"User access authorized.",
|
||||||
FAILLOG_FILE, (unsigned long) uid));
|
FAILLOG_FILE, (unsigned long) uid));
|
||||||
return 1;
|
return 1;
|
||||||
@@ -163,7 +182,7 @@ int failcheck (uid_t uid, struct faillog *fl, bool failed)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ( (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|
if ( (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|
||||||
|| (read (fd, (char *) fl, sizeof *fl) != (ssize_t) sizeof *fl)) {
|
|| (read (fd, fl, sizeof *fl) != (ssize_t) sizeof *fl)) {
|
||||||
(void) close (fd);
|
(void) close (fd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -185,18 +204,30 @@ int failcheck (uid_t uid, struct faillog *fl, bool failed)
|
|||||||
fail.fail_cnt = 0;
|
fail.fail_cnt = 0;
|
||||||
|
|
||||||
if ( (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|
if ( (lseek (fd, offset_uid, SEEK_SET) != offset_uid)
|
||||||
|| (write (fd, (const void *) &fail, sizeof fail) != (ssize_t) sizeof fail)
|
|| (write_full(fd, &fail, sizeof fail) == -1)) {
|
||||||
|| (close (fd) != 0)) {
|
goto err_write;
|
||||||
SYSLOG ((LOG_WARN,
|
}
|
||||||
"Can't reset faillog entry for UID %lu in %s.",
|
|
||||||
(unsigned long) uid, FAILLOG_FILE));
|
if (close (fd) != 0 && errno != EINTR) {
|
||||||
(void) close (fd);
|
goto err_close;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
(void) close (fd);
|
(void) close (fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
err_write:
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
(void) close (fd);
|
||||||
|
errno = saved_errno;
|
||||||
|
}
|
||||||
|
err_close:
|
||||||
|
SYSLOG ((LOG_WARN,
|
||||||
|
"Can't reset faillog entry for UID %lu in %s: %m",
|
||||||
|
(unsigned long) uid, FAILLOG_FILE));
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -223,7 +254,7 @@ void failprint (const struct faillog *fail)
|
|||||||
/*
|
/*
|
||||||
* Print all information we have.
|
* Print all information we have.
|
||||||
*/
|
*/
|
||||||
(void) strftime (lasttimeb, sizeof lasttimeb, "%c", tp);
|
STRFTIME(lasttimeb, "%c", tp);
|
||||||
|
|
||||||
/*@-formatconst@*/
|
/*@-formatconst@*/
|
||||||
(void) printf (ngettext ("%d failure since last login.\n"
|
(void) printf (ngettext ("%d failure since last login.\n"
|
||||||
@@ -234,62 +265,3 @@ void failprint (const struct faillog *fail)
|
|||||||
fail->fail_cnt, lasttime, fail->fail_line);
|
fail->fail_cnt, lasttime, fail->fail_line);
|
||||||
/*@=formatconst@*/
|
/*@=formatconst@*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* failtmp - update the cumulative failure log
|
|
||||||
*
|
|
||||||
* failtmp updates the (struct utmp) formatted failure log which
|
|
||||||
* maintains a record of all login failures.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void failtmp (const char *username,
|
|
||||||
#ifdef USE_UTMPX
|
|
||||||
const struct utmpx *failent
|
|
||||||
#else /* !USE_UTMPX */
|
|
||||||
const struct utmp *failent
|
|
||||||
#endif /* !USE_UTMPX */
|
|
||||||
)
|
|
||||||
{
|
|
||||||
const char *ftmp;
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the name of the failure file. If no file has been defined
|
|
||||||
* in login.defs, don't do this.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ftmp = getdef_str ("FTMP_FILE");
|
|
||||||
if (NULL == ftmp) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Open the file for append. It must already exist for this
|
|
||||||
* feature to be used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (access (ftmp, F_OK) != 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fd = open (ftmp, O_WRONLY | O_APPEND);
|
|
||||||
if (-1 == fd) {
|
|
||||||
SYSLOG ((LOG_WARN,
|
|
||||||
"Can't append failure of user %s to %s.",
|
|
||||||
username, ftmp));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Append the new failure record and close the log file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( (write (fd, (const void *) failent, sizeof *failent) != (ssize_t) sizeof *failent)
|
|
||||||
|| (close (fd) != 0)) {
|
|
||||||
SYSLOG ((LOG_WARN,
|
|
||||||
"Can't append failure of user %s to %s.",
|
|
||||||
username, ftmp));
|
|
||||||
(void) close (fd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -13,11 +13,6 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "faillog.h"
|
#include "faillog.h"
|
||||||
#ifdef USE_UTMPX
|
|
||||||
#include <utmpx.h>
|
|
||||||
#else /* !USE_UTMPX */
|
|
||||||
#include <utmp.h>
|
|
||||||
#endif /* !USE_UTMPX */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* failure - make failure entry
|
* failure - make failure entry
|
||||||
@@ -45,17 +40,5 @@ extern int failcheck (uid_t uid, struct faillog *fl, bool failed);
|
|||||||
*/
|
*/
|
||||||
extern void failprint (const struct faillog *);
|
extern void failprint (const struct faillog *);
|
||||||
|
|
||||||
/*
|
|
||||||
* failtmp - update the cumulative failure log
|
|
||||||
*
|
|
||||||
* failtmp updates the (struct utmp) formatted failure log which
|
|
||||||
* maintains a record of all login failures.
|
|
||||||
*/
|
|
||||||
#ifdef USE_UTMPX
|
|
||||||
extern void failtmp (const char *username, const struct utmpx *);
|
|
||||||
#else /* !USE_UTMPX */
|
|
||||||
extern void failtmp (const char *username, const struct utmp *);
|
|
||||||
#endif /* !USE_UTMPX */
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024, Skyler Ferrante <sjf5462@rit.edu>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To protect against file descriptor omission attacks, we open the std file
|
||||||
|
* descriptors with /dev/null if they are not already open. Code is based on
|
||||||
|
* fix_fds from sudo.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "prototypes.h"
|
||||||
|
|
||||||
|
static void check_fd(int fd);
|
||||||
|
|
||||||
|
void
|
||||||
|
check_fds(void)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Make sure stdin, stdout, stderr are open
|
||||||
|
* If they are closed, set them to /dev/null
|
||||||
|
*/
|
||||||
|
check_fd(STDIN_FILENO);
|
||||||
|
check_fd(STDOUT_FILENO);
|
||||||
|
check_fd(STDERR_FILENO);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
check_fd(int fd)
|
||||||
|
{
|
||||||
|
int devnull;
|
||||||
|
|
||||||
|
if (fcntl(fd, F_GETFL, 0) != -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
devnull = open("/dev/null", O_RDWR);
|
||||||
|
if (devnull != fd)
|
||||||
|
abort();
|
||||||
|
}
|
||||||
+20
-22
@@ -21,9 +21,9 @@
|
|||||||
*
|
*
|
||||||
* The supplied field is scanned for non-printable and other illegal
|
* The supplied field is scanned for non-printable and other illegal
|
||||||
* characters.
|
* characters.
|
||||||
* + -1 is returned if an illegal character is present.
|
* + -1 is returned if an illegal or control character is present.
|
||||||
* + 1 is returned if no illegal characters are present, but the field
|
* + 1 is returned if no illegal or control characters are present,
|
||||||
* contains a non-printable character.
|
* but the field contains a non-printable character.
|
||||||
* + 0 is returned otherwise.
|
* + 0 is returned otherwise.
|
||||||
*/
|
*/
|
||||||
int valid_field (const char *field, const char *illegal)
|
int valid_field (const char *field, const char *illegal)
|
||||||
@@ -37,20 +37,19 @@ int valid_field (const char *field, const char *illegal)
|
|||||||
|
|
||||||
/* For each character of field, search if it appears in the list
|
/* For each character of field, search if it appears in the list
|
||||||
* of illegal characters. */
|
* of illegal characters. */
|
||||||
for (cp = field; '\0' != *cp; cp++) {
|
if (illegal && NULL != strpbrk (field, illegal)) {
|
||||||
if (strchr (illegal, *cp) != NULL) {
|
return -1;
|
||||||
err = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 == err) {
|
/* Search if there are non-printable or control characters */
|
||||||
/* Search if there are some non-printable characters */
|
for (cp = field; '\0' != *cp; cp++) {
|
||||||
for (cp = field; '\0' != *cp; cp++) {
|
unsigned char c = *cp;
|
||||||
if (!isprint (*cp)) {
|
if (!isprint (c)) {
|
||||||
err = 1;
|
err = 1;
|
||||||
break;
|
}
|
||||||
}
|
if (iscntrl (c)) {
|
||||||
|
err = -1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +73,7 @@ void change_field (char *buf, size_t maxsize, const char *prompt)
|
|||||||
|
|
||||||
printf ("\t%s [%s]: ", prompt, buf);
|
printf ("\t%s [%s]: ", prompt, buf);
|
||||||
(void) fflush (stdout);
|
(void) fflush (stdout);
|
||||||
if (fgets (newf, (int) maxsize, stdin) != newf) {
|
if (fgets (newf, maxsize, stdin) != newf) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,17 +90,16 @@ void change_field (char *buf, size_t maxsize, const char *prompt)
|
|||||||
* entering a space. --marekm
|
* entering a space. --marekm
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while (--cp >= newf && isspace (*cp));
|
while (newf < cp && isspace (cp[-1])) {
|
||||||
cp++;
|
cp--;
|
||||||
|
}
|
||||||
*cp = '\0';
|
*cp = '\0';
|
||||||
|
|
||||||
cp = newf;
|
cp = newf;
|
||||||
while (('\0' != *cp) && isspace (*cp)) {
|
while (isspace (*cp)) {
|
||||||
cp++;
|
cp++;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy (buf, cp, maxsize - 1);
|
strcpy (buf, cp);
|
||||||
buf[maxsize - 1] = '\0';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "groupio.h"
|
#include "groupio.h"
|
||||||
#include "getdef.h"
|
#include "getdef.h"
|
||||||
@@ -40,15 +41,14 @@ static int get_ranges (bool sys_group, gid_t *min_id, gid_t *max_id,
|
|||||||
*preferred_min = (gid_t) 1;
|
*preferred_min = (gid_t) 1;
|
||||||
|
|
||||||
/* Get the minimum ID range from login.defs or default to 101 */
|
/* Get the minimum ID range from login.defs or default to 101 */
|
||||||
*min_id = (gid_t) getdef_ulong ("SYS_GID_MIN", 101UL);
|
*min_id = getdef_ulong ("SYS_GID_MIN", 101UL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If SYS_GID_MAX is unspecified, we should assume it to be one
|
* If SYS_GID_MAX is unspecified, we should assume it to be one
|
||||||
* less than the GID_MIN (which is reserved for non-system accounts)
|
* less than the GID_MIN (which is reserved for non-system accounts)
|
||||||
*/
|
*/
|
||||||
gid_def_max = (gid_t) getdef_ulong ("GID_MIN", 1000UL) - 1;
|
gid_def_max = getdef_ulong ("GID_MIN", 1000UL) - 1;
|
||||||
*max_id = (gid_t) getdef_ulong ("SYS_GID_MAX",
|
*max_id = getdef_ulong ("SYS_GID_MAX", gid_def_max);
|
||||||
(unsigned long) gid_def_max);
|
|
||||||
|
|
||||||
/* Check that the ranges make sense */
|
/* Check that the ranges make sense */
|
||||||
if (*max_id < *min_id) {
|
if (*max_id < *min_id) {
|
||||||
@@ -71,8 +71,8 @@ static int get_ranges (bool sys_group, gid_t *min_id, gid_t *max_id,
|
|||||||
/* Non-system groups */
|
/* Non-system groups */
|
||||||
|
|
||||||
/* Get the values from login.defs or use reasonable defaults */
|
/* Get the values from login.defs or use reasonable defaults */
|
||||||
*min_id = (gid_t) getdef_ulong ("GID_MIN", 1000UL);
|
*min_id = getdef_ulong ("GID_MIN", 1000UL);
|
||||||
*max_id = (gid_t) getdef_ulong ("GID_MAX", 60000UL);
|
*max_id = getdef_ulong ("GID_MAX", 60000UL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The preferred minimum should match the standard ID minimum
|
* The preferred minimum should match the standard ID minimum
|
||||||
@@ -99,6 +99,7 @@ static int get_ranges (bool sys_group, gid_t *min_id, gid_t *max_id,
|
|||||||
*
|
*
|
||||||
* On success, return 0
|
* On success, return 0
|
||||||
* If the ID is in use, return EEXIST
|
* If the ID is in use, return EEXIST
|
||||||
|
* If the ID might clash with -1, return EINVAL
|
||||||
* If the ID is outside the range, return ERANGE
|
* If the ID is outside the range, return ERANGE
|
||||||
* In other cases, return errno from getgrgid()
|
* In other cases, return errno from getgrgid()
|
||||||
*/
|
*/
|
||||||
@@ -112,6 +113,11 @@ static int check_gid (const gid_t gid,
|
|||||||
return ERANGE;
|
return ERANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check for compatibility with 16b and 32b gid_t error codes */
|
||||||
|
if (gid == UINT16_MAX || gid == UINT32_MAX) {
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check whether we already detected this GID
|
* Check whether we already detected this GID
|
||||||
* using the gr_next() loop
|
* using the gr_next() loop
|
||||||
@@ -183,10 +189,10 @@ int find_new_gid (bool sys_group,
|
|||||||
* gr_locate_gid() found the GID in an as-yet uncommitted
|
* gr_locate_gid() found the GID in an as-yet uncommitted
|
||||||
* entry. We'll proceed below and auto-set a GID.
|
* entry. We'll proceed below and auto-set a GID.
|
||||||
*/
|
*/
|
||||||
} else if (result == EEXIST || result == ERANGE) {
|
} else if (result == EEXIST || result == ERANGE || result == EINVAL) {
|
||||||
/*
|
/*
|
||||||
* Continue on below. At this time, we won't
|
* Continue on below. At this time, we won't
|
||||||
* treat these two cases differently.
|
* treat these three cases differently.
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
@@ -226,14 +232,13 @@ int find_new_gid (bool sys_group,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Create an array to hold all of the discovered GIDs */
|
/* Create an array to hold all of the discovered GIDs */
|
||||||
used_gids = malloc (sizeof (bool) * (gid_max +1));
|
used_gids = CALLOC (gid_max + 1, bool);
|
||||||
if (NULL == used_gids) {
|
if (NULL == used_gids) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
_("%s: failed to allocate memory: %s\n"),
|
_("%s: failed to allocate memory: %s\n"),
|
||||||
log_get_progname(), strerror (errno));
|
log_get_progname(), strerror (errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset (used_gids, false, sizeof (bool) * (gid_max + 1));
|
|
||||||
|
|
||||||
/* First look for the lowest and highest value in the local database */
|
/* First look for the lowest and highest value in the local database */
|
||||||
(void) gr_rewind ();
|
(void) gr_rewind ();
|
||||||
@@ -297,8 +302,11 @@ int find_new_gid (bool sys_group,
|
|||||||
*gid = id;
|
*gid = id;
|
||||||
free (used_gids);
|
free (used_gids);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (result == EEXIST) {
|
} else if (result == EEXIST || result == EINVAL) {
|
||||||
/* This GID is in use, we'll continue to the next */
|
/*
|
||||||
|
* This GID is in use or unusable, we'll
|
||||||
|
* continue to the next.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* An unexpected error occurred.
|
* An unexpected error occurred.
|
||||||
@@ -340,8 +348,11 @@ int find_new_gid (bool sys_group,
|
|||||||
*gid = id;
|
*gid = id;
|
||||||
free (used_gids);
|
free (used_gids);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (result == EEXIST) {
|
} else if (result == EEXIST || result == EINVAL) {
|
||||||
/* This GID is in use, we'll continue to the next */
|
/*
|
||||||
|
* This GID is in use or unusable, we'll
|
||||||
|
* continue to the next.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* An unexpected error occurred.
|
* An unexpected error occurred.
|
||||||
@@ -400,8 +411,11 @@ int find_new_gid (bool sys_group,
|
|||||||
*gid = id;
|
*gid = id;
|
||||||
free (used_gids);
|
free (used_gids);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (result == EEXIST) {
|
} else if (result == EEXIST || result == EINVAL) {
|
||||||
/* This GID is in use, we'll continue to the next */
|
/*
|
||||||
|
* This GID is in use or unusable, we'll
|
||||||
|
* continue to the next.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* An unexpected error occurred.
|
* An unexpected error occurred.
|
||||||
@@ -443,8 +457,11 @@ int find_new_gid (bool sys_group,
|
|||||||
*gid = id;
|
*gid = id;
|
||||||
free (used_gids);
|
free (used_gids);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (result == EEXIST) {
|
} else if (result == EEXIST || result == EINVAL) {
|
||||||
/* This GID is in use, we'll continue to the next */
|
/*
|
||||||
|
* This GID is in use or unusable, we'll
|
||||||
|
* continue to the next.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* An unexpected error occurred.
|
* An unexpected error occurred.
|
||||||
@@ -59,6 +59,6 @@ int find_new_sub_gids (gid_t *range_start, unsigned long *range_count)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else /* !ENABLE_SUBIDS */
|
#else /* !ENABLE_SUBIDS */
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
extern int ISO_C_forbids_an_empty_translation_unit;
|
||||||
#endif /* !ENABLE_SUBIDS */
|
#endif /* !ENABLE_SUBIDS */
|
||||||
|
|
||||||
@@ -59,6 +59,6 @@ int find_new_sub_uids (uid_t *range_start, unsigned long *range_count)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else /* !ENABLE_SUBIDS */
|
#else /* !ENABLE_SUBIDS */
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
extern int ISO_C_forbids_an_empty_translation_unit;
|
||||||
#endif /* !ENABLE_SUBIDS */
|
#endif /* !ENABLE_SUBIDS */
|
||||||
|
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "pwio.h"
|
#include "pwio.h"
|
||||||
#include "getdef.h"
|
#include "getdef.h"
|
||||||
@@ -40,15 +41,14 @@ static int get_ranges (bool sys_user, uid_t *min_id, uid_t *max_id,
|
|||||||
*preferred_min = (uid_t) 1;
|
*preferred_min = (uid_t) 1;
|
||||||
|
|
||||||
/* Get the minimum ID range from login.defs or default to 101 */
|
/* Get the minimum ID range from login.defs or default to 101 */
|
||||||
*min_id = (uid_t) getdef_ulong ("SYS_UID_MIN", 101UL);
|
*min_id = getdef_ulong ("SYS_UID_MIN", 101UL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If SYS_UID_MAX is unspecified, we should assume it to be one
|
* If SYS_UID_MAX is unspecified, we should assume it to be one
|
||||||
* less than the UID_MIN (which is reserved for non-system accounts)
|
* less than the UID_MIN (which is reserved for non-system accounts)
|
||||||
*/
|
*/
|
||||||
uid_def_max = (uid_t) getdef_ulong ("UID_MIN", 1000UL) - 1;
|
uid_def_max = getdef_ulong ("UID_MIN", 1000UL) - 1;
|
||||||
*max_id = (uid_t) getdef_ulong ("SYS_UID_MAX",
|
*max_id = getdef_ulong ("SYS_UID_MAX", uid_def_max);
|
||||||
(unsigned long) uid_def_max);
|
|
||||||
|
|
||||||
/* Check that the ranges make sense */
|
/* Check that the ranges make sense */
|
||||||
if (*max_id < *min_id) {
|
if (*max_id < *min_id) {
|
||||||
@@ -71,8 +71,8 @@ static int get_ranges (bool sys_user, uid_t *min_id, uid_t *max_id,
|
|||||||
/* Non-system users */
|
/* Non-system users */
|
||||||
|
|
||||||
/* Get the values from login.defs or use reasonable defaults */
|
/* Get the values from login.defs or use reasonable defaults */
|
||||||
*min_id = (uid_t) getdef_ulong ("UID_MIN", 1000UL);
|
*min_id = getdef_ulong ("UID_MIN", 1000UL);
|
||||||
*max_id = (uid_t) getdef_ulong ("UID_MAX", 60000UL);
|
*max_id = getdef_ulong ("UID_MAX", 60000UL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The preferred minimum should match the standard ID minimum
|
* The preferred minimum should match the standard ID minimum
|
||||||
@@ -99,6 +99,7 @@ static int get_ranges (bool sys_user, uid_t *min_id, uid_t *max_id,
|
|||||||
*
|
*
|
||||||
* On success, return 0
|
* On success, return 0
|
||||||
* If the ID is in use, return EEXIST
|
* If the ID is in use, return EEXIST
|
||||||
|
* If the ID might clash with -1, return EINVAL
|
||||||
* If the ID is outside the range, return ERANGE
|
* If the ID is outside the range, return ERANGE
|
||||||
* In other cases, return errno from getpwuid()
|
* In other cases, return errno from getpwuid()
|
||||||
*/
|
*/
|
||||||
@@ -112,6 +113,11 @@ static int check_uid(const uid_t uid,
|
|||||||
return ERANGE;
|
return ERANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check for compatibility with 16b and 32b uid_t error codes */
|
||||||
|
if (uid == UINT16_MAX || uid == UINT32_MAX) {
|
||||||
|
return EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check whether we already detected this UID
|
* Check whether we already detected this UID
|
||||||
* using the pw_next() loop
|
* using the pw_next() loop
|
||||||
@@ -183,10 +189,10 @@ int find_new_uid(bool sys_user,
|
|||||||
* pw_locate_uid() found the UID in an as-yet uncommitted
|
* pw_locate_uid() found the UID in an as-yet uncommitted
|
||||||
* entry. We'll proceed below and auto-set an UID.
|
* entry. We'll proceed below and auto-set an UID.
|
||||||
*/
|
*/
|
||||||
} else if (result == EEXIST || result == ERANGE) {
|
} else if (result == EEXIST || result == ERANGE || result == EINVAL) {
|
||||||
/*
|
/*
|
||||||
* Continue on below. At this time, we won't
|
* Continue on below. At this time, we won't
|
||||||
* treat these two cases differently.
|
* treat these three cases differently.
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
@@ -226,14 +232,13 @@ int find_new_uid(bool sys_user,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Create an array to hold all of the discovered UIDs */
|
/* Create an array to hold all of the discovered UIDs */
|
||||||
used_uids = malloc (sizeof (bool) * (uid_max +1));
|
used_uids = CALLOC(uid_max + 1, bool);
|
||||||
if (NULL == used_uids) {
|
if (NULL == used_uids) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
_("%s: failed to allocate memory: %s\n"),
|
_("%s: failed to allocate memory: %s\n"),
|
||||||
log_get_progname(), strerror (errno));
|
log_get_progname(), strerror (errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset (used_uids, false, sizeof (bool) * (uid_max + 1));
|
|
||||||
|
|
||||||
/* First look for the lowest and highest value in the local database */
|
/* First look for the lowest and highest value in the local database */
|
||||||
(void) pw_rewind ();
|
(void) pw_rewind ();
|
||||||
@@ -297,8 +302,11 @@ int find_new_uid(bool sys_user,
|
|||||||
*uid = id;
|
*uid = id;
|
||||||
free (used_uids);
|
free (used_uids);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (result == EEXIST) {
|
} else if (result == EEXIST || result == EINVAL) {
|
||||||
/* This UID is in use, we'll continue to the next */
|
/*
|
||||||
|
* This GID is in use or unusable, we'll
|
||||||
|
* continue to the next.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* An unexpected error occurred.
|
* An unexpected error occurred.
|
||||||
@@ -340,8 +348,11 @@ int find_new_uid(bool sys_user,
|
|||||||
*uid = id;
|
*uid = id;
|
||||||
free (used_uids);
|
free (used_uids);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (result == EEXIST) {
|
} else if (result == EEXIST || result == EINVAL) {
|
||||||
/* This UID is in use, we'll continue to the next */
|
/*
|
||||||
|
* This GID is in use or unusable, we'll
|
||||||
|
* continue to the next.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* An unexpected error occurred.
|
* An unexpected error occurred.
|
||||||
@@ -400,8 +411,11 @@ int find_new_uid(bool sys_user,
|
|||||||
*uid = id;
|
*uid = id;
|
||||||
free (used_uids);
|
free (used_uids);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (result == EEXIST) {
|
} else if (result == EEXIST || result == EINVAL) {
|
||||||
/* This UID is in use, we'll continue to the next */
|
/*
|
||||||
|
* This GID is in use or unusable, we'll
|
||||||
|
* continue to the next.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* An unexpected error occurred.
|
* An unexpected error occurred.
|
||||||
@@ -443,8 +457,11 @@ int find_new_uid(bool sys_user,
|
|||||||
*uid = id;
|
*uid = id;
|
||||||
free (used_uids);
|
free (used_uids);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (result == EEXIST) {
|
} else if (result == EEXIST || result == EINVAL) {
|
||||||
/* This UID is in use, we'll continue to the next */
|
/*
|
||||||
|
* This GID is in use or unusable, we'll
|
||||||
|
* continue to the next.
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* An unexpected error occurred.
|
* An unexpected error occurred.
|
||||||
+2
-1
@@ -16,7 +16,8 @@
|
|||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
|
|
||||||
/*@null@*/char *fgetsx (/*@returned@*/ /*@out@*/char *buf, int cnt, FILE * f)
|
/*@null@*/char *
|
||||||
|
fgetsx(/*@returned@*/char *restrict buf, int cnt, FILE *restrict f)
|
||||||
{
|
{
|
||||||
char *cp = buf;
|
char *cp = buf;
|
||||||
char *ep;
|
char *ep;
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/* $OpenBSD: malloc.c,v 1.267 2020/11/23 15:42:11 otto Exp $ */
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
freezero(void *ptr, size_t sz)
|
||||||
|
{
|
||||||
|
/* This is legal. */
|
||||||
|
if (ptr == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
explicit_bzero(ptr, sz);
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright © 2005 Aurelien Jarno
|
||||||
|
* Copyright © 2006 Robert Millan
|
||||||
|
* Copyright © 2008-2011 Guillem Jover <guillem@hadrons.org>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce 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 author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (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 LIBBSD_FREEZERO_H
|
||||||
|
#define LIBBSD_FREEZERO_H
|
||||||
|
|
||||||
|
void freezero(void *ptr, size_t size);
|
||||||
|
|
||||||
|
#endif
|
||||||
+12
-9
@@ -4,6 +4,7 @@
|
|||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
@@ -11,21 +12,23 @@
|
|||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
int get_gid (const char *gidstr, gid_t *gid)
|
|
||||||
|
int
|
||||||
|
get_gid(const char *gidstr, gid_t *gid)
|
||||||
{
|
{
|
||||||
long long int val;
|
char *end;
|
||||||
char *endptr;
|
long long val;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
val = strtoll (gidstr, &endptr, 10);
|
val = strtoll(gidstr, &end, 10);
|
||||||
if ( ('\0' == *gidstr)
|
if ( ('\0' == *gidstr)
|
||||||
|| ('\0' != *endptr)
|
|| ('\0' != *end)
|
||||||
|| (ERANGE == errno)
|
|| (0 != errno)
|
||||||
|| (/*@+longintegral@*/val != (gid_t)val)/*@=longintegral@*/) {
|
|| (/*@+longintegral@*/val != (gid_t)val)/*@=longintegral@*/) {
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*gid = (gid_t)val;
|
*gid = val;
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+81
-9
@@ -10,22 +10,94 @@
|
|||||||
|
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
int get_pid (const char *pidstr, pid_t *pid)
|
#include "string/sprintf.h"
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
get_pid(const char *pidstr, pid_t *pid)
|
||||||
{
|
{
|
||||||
long long int val;
|
char *end;
|
||||||
char *endptr;
|
long long val;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
val = strtoll (pidstr, &endptr, 10);
|
val = strtoll(pidstr, &end, 10);
|
||||||
if ( ('\0' == *pidstr)
|
if ( ('\0' == *pidstr)
|
||||||
|| ('\0' != *endptr)
|
|| ('\0' != *end)
|
||||||
|| (ERANGE == errno)
|
|| (0 != errno)
|
||||||
|
|| (val < 1)
|
||||||
|| (/*@+longintegral@*/val != (pid_t)val)/*@=longintegral@*/) {
|
|| (/*@+longintegral@*/val != (pid_t)val)/*@=longintegral@*/) {
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*pid = (pid_t)val;
|
*pid = val;
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If use passed in fd:4 as an argument, then return the
|
||||||
|
* value '4', the fd to use.
|
||||||
|
* On error, return -1.
|
||||||
|
*/
|
||||||
|
int get_pidfd_from_fd(const char *pidfdstr)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
long long val;
|
||||||
|
struct stat st;
|
||||||
|
dev_t proc_st_dev, proc_st_rdev;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
val = strtoll(pidfdstr, &end, 10);
|
||||||
|
if ( ('\0' == *pidfdstr)
|
||||||
|
|| ('\0' != *end)
|
||||||
|
|| (0 != errno)
|
||||||
|
|| (val < 0)
|
||||||
|
|| (/*@+longintegral@*/val != (int)val)/*@=longintegral@*/) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stat("/proc/self/uid_map", &st) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
proc_st_dev = st.st_dev;
|
||||||
|
proc_st_rdev = st.st_rdev;
|
||||||
|
|
||||||
|
if (fstat(val, &st) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (st.st_dev != proc_st_dev || st.st_rdev != proc_st_rdev) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
int open_pidfd(const char *pidstr)
|
||||||
|
{
|
||||||
|
int proc_dir_fd;
|
||||||
|
char proc_dir_name[32];
|
||||||
|
pid_t target;
|
||||||
|
|
||||||
|
if (get_pid(pidstr, &target) == -1)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
/* max string length is 6 + 10 + 1 + 1 = 18, allocate 32 bytes */
|
||||||
|
if (SNPRINTF(proc_dir_name, "/proc/%u/", target) == -1) {
|
||||||
|
fprintf(stderr, "snprintf of proc path failed for %u: %s\n",
|
||||||
|
target, strerror(errno));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
proc_dir_fd = open(proc_dir_name, O_DIRECTORY);
|
||||||
|
if (proc_dir_fd < 0) {
|
||||||
|
fprintf(stderr, _("Could not open proc directory for target %u: %s\n"),
|
||||||
|
target, strerror(errno));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
return proc_dir_fd;
|
||||||
|
}
|
||||||
|
|||||||
+12
-9
@@ -4,6 +4,7 @@
|
|||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
@@ -11,21 +12,23 @@
|
|||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
int get_uid (const char *uidstr, uid_t *uid)
|
|
||||||
|
int
|
||||||
|
get_uid(const char *uidstr, uid_t *uid)
|
||||||
{
|
{
|
||||||
long long int val;
|
char *end;
|
||||||
char *endptr;
|
long long val;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
val = strtoll (uidstr, &endptr, 10);
|
val = strtoll(uidstr, &end, 10);
|
||||||
if ( ('\0' == *uidstr)
|
if ( ('\0' == *uidstr)
|
||||||
|| ('\0' != *endptr)
|
|| ('\0' != *end)
|
||||||
|| (ERANGE == errno)
|
|| (0 != errno)
|
||||||
|| (/*@+longintegral@*/val != (uid_t)val)/*@=longintegral@*/) {
|
|| (/*@+longintegral@*/val != (uid_t)val)/*@=longintegral@*/) {
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*uid = (uid_t)val;
|
*uid = val;
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+112
-117
@@ -82,9 +82,6 @@
|
|||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
# ifdef FORCE_ALLOCA_H
|
|
||||||
# include <alloca.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Since the code of getdate.y is not included in the Emacs executable
|
/* Since the code of getdate.y is not included in the Emacs executable
|
||||||
@@ -101,6 +98,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
#include "getdate.h"
|
#include "getdate.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -215,7 +213,7 @@ static int yyRelSeconds;
|
|||||||
static int yyRelYear;
|
static int yyRelYear;
|
||||||
|
|
||||||
|
|
||||||
#line 219 "getdate.c"
|
#line 217 "getdate.c"
|
||||||
|
|
||||||
# ifndef YY_CAST
|
# ifndef YY_CAST
|
||||||
# ifdef __cplusplus
|
# ifdef __cplusplus
|
||||||
@@ -301,12 +299,12 @@ extern int yydebug;
|
|||||||
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||||
union YYSTYPE
|
union YYSTYPE
|
||||||
{
|
{
|
||||||
#line 149 "getdate.y"
|
#line 147 "getdate.y"
|
||||||
|
|
||||||
int Number;
|
int Number;
|
||||||
enum _MERIDIAN Meridian;
|
enum _MERIDIAN Meridian;
|
||||||
|
|
||||||
#line 310 "getdate.c"
|
#line 308 "getdate.c"
|
||||||
|
|
||||||
};
|
};
|
||||||
typedef union YYSTYPE YYSTYPE;
|
typedef union YYSTYPE YYSTYPE;
|
||||||
@@ -746,12 +744,12 @@ static const yytype_int8 yytranslate[] =
|
|||||||
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
|
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
|
||||||
static const yytype_int16 yyrline[] =
|
static const yytype_int16 yyrline[] =
|
||||||
{
|
{
|
||||||
0, 165, 165, 166, 169, 172, 175, 178, 181, 184,
|
0, 163, 163, 164, 167, 170, 173, 176, 179, 182,
|
||||||
187, 193, 199, 208, 214, 226, 229, 233, 238, 242,
|
185, 191, 197, 206, 212, 224, 227, 231, 236, 240,
|
||||||
246, 252, 256, 274, 280, 286, 290, 295, 299, 306,
|
244, 250, 254, 272, 278, 284, 288, 293, 297, 304,
|
||||||
314, 317, 320, 323, 326, 329, 332, 335, 338, 341,
|
312, 315, 318, 321, 324, 327, 330, 333, 336, 339,
|
||||||
344, 347, 350, 353, 356, 359, 362, 365, 368, 373,
|
342, 345, 348, 351, 354, 357, 360, 363, 366, 371,
|
||||||
407, 410
|
405, 408
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1352,69 +1350,69 @@ yyreduce:
|
|||||||
switch (yyn)
|
switch (yyn)
|
||||||
{
|
{
|
||||||
case 4: /* item: time */
|
case 4: /* item: time */
|
||||||
#line 169 "getdate.y"
|
#line 167 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHaveTime++;
|
yyHaveTime++;
|
||||||
}
|
}
|
||||||
#line 1360 "getdate.c"
|
#line 1358 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5: /* item: zone */
|
case 5: /* item: zone */
|
||||||
#line 172 "getdate.y"
|
#line 170 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHaveZone++;
|
yyHaveZone++;
|
||||||
}
|
}
|
||||||
#line 1368 "getdate.c"
|
#line 1366 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6: /* item: date */
|
case 6: /* item: date */
|
||||||
#line 175 "getdate.y"
|
#line 173 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHaveDate++;
|
yyHaveDate++;
|
||||||
}
|
}
|
||||||
#line 1376 "getdate.c"
|
#line 1374 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7: /* item: day */
|
case 7: /* item: day */
|
||||||
#line 178 "getdate.y"
|
#line 176 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHaveDay++;
|
yyHaveDay++;
|
||||||
}
|
}
|
||||||
#line 1384 "getdate.c"
|
#line 1382 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8: /* item: rel */
|
case 8: /* item: rel */
|
||||||
#line 181 "getdate.y"
|
#line 179 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHaveRel++;
|
yyHaveRel++;
|
||||||
}
|
}
|
||||||
#line 1392 "getdate.c"
|
#line 1390 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10: /* time: tUNUMBER tMERIDIAN */
|
case 10: /* time: tUNUMBER tMERIDIAN */
|
||||||
#line 187 "getdate.y"
|
#line 185 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHour = (yyvsp[-1].Number);
|
yyHour = (yyvsp[-1].Number);
|
||||||
yyMinutes = 0;
|
yyMinutes = 0;
|
||||||
yySeconds = 0;
|
yySeconds = 0;
|
||||||
yyMeridian = (yyvsp[0].Meridian);
|
yyMeridian = (yyvsp[0].Meridian);
|
||||||
}
|
}
|
||||||
#line 1403 "getdate.c"
|
#line 1401 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11: /* time: tUNUMBER ':' tUNUMBER o_merid */
|
case 11: /* time: tUNUMBER ':' tUNUMBER o_merid */
|
||||||
#line 193 "getdate.y"
|
#line 191 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHour = (yyvsp[-3].Number);
|
yyHour = (yyvsp[-3].Number);
|
||||||
yyMinutes = (yyvsp[-1].Number);
|
yyMinutes = (yyvsp[-1].Number);
|
||||||
yySeconds = 0;
|
yySeconds = 0;
|
||||||
yyMeridian = (yyvsp[0].Meridian);
|
yyMeridian = (yyvsp[0].Meridian);
|
||||||
}
|
}
|
||||||
#line 1414 "getdate.c"
|
#line 1412 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12: /* time: tUNUMBER ':' tUNUMBER tSNUMBER */
|
case 12: /* time: tUNUMBER ':' tUNUMBER tSNUMBER */
|
||||||
#line 199 "getdate.y"
|
#line 197 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHour = (yyvsp[-3].Number);
|
yyHour = (yyvsp[-3].Number);
|
||||||
yyMinutes = (yyvsp[-1].Number);
|
yyMinutes = (yyvsp[-1].Number);
|
||||||
@@ -1424,22 +1422,22 @@ yyreduce:
|
|||||||
? -(yyvsp[0].Number) % 100 + (-(yyvsp[0].Number) / 100) * 60
|
? -(yyvsp[0].Number) % 100 + (-(yyvsp[0].Number) / 100) * 60
|
||||||
: - ((yyvsp[0].Number) % 100 + ((yyvsp[0].Number) / 100) * 60));
|
: - ((yyvsp[0].Number) % 100 + ((yyvsp[0].Number) / 100) * 60));
|
||||||
}
|
}
|
||||||
#line 1428 "getdate.c"
|
#line 1426 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 13: /* time: tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid */
|
case 13: /* time: tUNUMBER ':' tUNUMBER ':' tUNUMBER o_merid */
|
||||||
#line 208 "getdate.y"
|
#line 206 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHour = (yyvsp[-5].Number);
|
yyHour = (yyvsp[-5].Number);
|
||||||
yyMinutes = (yyvsp[-3].Number);
|
yyMinutes = (yyvsp[-3].Number);
|
||||||
yySeconds = (yyvsp[-1].Number);
|
yySeconds = (yyvsp[-1].Number);
|
||||||
yyMeridian = (yyvsp[0].Meridian);
|
yyMeridian = (yyvsp[0].Meridian);
|
||||||
}
|
}
|
||||||
#line 1439 "getdate.c"
|
#line 1437 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 14: /* time: tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER */
|
case 14: /* time: tUNUMBER ':' tUNUMBER ':' tUNUMBER tSNUMBER */
|
||||||
#line 214 "getdate.y"
|
#line 212 "getdate.y"
|
||||||
{
|
{
|
||||||
yyHour = (yyvsp[-5].Number);
|
yyHour = (yyvsp[-5].Number);
|
||||||
yyMinutes = (yyvsp[-3].Number);
|
yyMinutes = (yyvsp[-3].Number);
|
||||||
@@ -1450,71 +1448,71 @@ yyreduce:
|
|||||||
? -(yyvsp[0].Number) % 100 + (-(yyvsp[0].Number) / 100) * 60
|
? -(yyvsp[0].Number) % 100 + (-(yyvsp[0].Number) / 100) * 60
|
||||||
: - ((yyvsp[0].Number) % 100 + ((yyvsp[0].Number) / 100) * 60));
|
: - ((yyvsp[0].Number) % 100 + ((yyvsp[0].Number) / 100) * 60));
|
||||||
}
|
}
|
||||||
#line 1454 "getdate.c"
|
#line 1452 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 15: /* zone: tZONE */
|
case 15: /* zone: tZONE */
|
||||||
#line 226 "getdate.y"
|
#line 224 "getdate.y"
|
||||||
{
|
{
|
||||||
yyTimezone = (yyvsp[0].Number);
|
yyTimezone = (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1462 "getdate.c"
|
#line 1460 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16: /* zone: tDAYZONE */
|
case 16: /* zone: tDAYZONE */
|
||||||
#line 229 "getdate.y"
|
#line 227 "getdate.y"
|
||||||
{
|
{
|
||||||
yyTimezone = (yyvsp[0].Number) - 60;
|
yyTimezone = (yyvsp[0].Number) - 60;
|
||||||
}
|
}
|
||||||
#line 1470 "getdate.c"
|
#line 1468 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17: /* zone: tZONE tDST */
|
case 17: /* zone: tZONE tDST */
|
||||||
#line 233 "getdate.y"
|
#line 231 "getdate.y"
|
||||||
{
|
{
|
||||||
yyTimezone = (yyvsp[-1].Number) - 60;
|
yyTimezone = (yyvsp[-1].Number) - 60;
|
||||||
}
|
}
|
||||||
#line 1478 "getdate.c"
|
#line 1476 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18: /* day: tDAY */
|
case 18: /* day: tDAY */
|
||||||
#line 238 "getdate.y"
|
#line 236 "getdate.y"
|
||||||
{
|
{
|
||||||
yyDayOrdinal = 1;
|
yyDayOrdinal = 1;
|
||||||
yyDayNumber = (yyvsp[0].Number);
|
yyDayNumber = (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1487 "getdate.c"
|
#line 1485 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19: /* day: tDAY ',' */
|
case 19: /* day: tDAY ',' */
|
||||||
#line 242 "getdate.y"
|
#line 240 "getdate.y"
|
||||||
{
|
{
|
||||||
yyDayOrdinal = 1;
|
yyDayOrdinal = 1;
|
||||||
yyDayNumber = (yyvsp[-1].Number);
|
yyDayNumber = (yyvsp[-1].Number);
|
||||||
}
|
}
|
||||||
#line 1496 "getdate.c"
|
#line 1494 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20: /* day: tUNUMBER tDAY */
|
case 20: /* day: tUNUMBER tDAY */
|
||||||
#line 246 "getdate.y"
|
#line 244 "getdate.y"
|
||||||
{
|
{
|
||||||
yyDayOrdinal = (yyvsp[-1].Number);
|
yyDayOrdinal = (yyvsp[-1].Number);
|
||||||
yyDayNumber = (yyvsp[0].Number);
|
yyDayNumber = (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1505 "getdate.c"
|
#line 1503 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 21: /* date: tUNUMBER '/' tUNUMBER */
|
case 21: /* date: tUNUMBER '/' tUNUMBER */
|
||||||
#line 252 "getdate.y"
|
#line 250 "getdate.y"
|
||||||
{
|
{
|
||||||
yyMonth = (yyvsp[-2].Number);
|
yyMonth = (yyvsp[-2].Number);
|
||||||
yyDay = (yyvsp[0].Number);
|
yyDay = (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1514 "getdate.c"
|
#line 1512 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 22: /* date: tUNUMBER '/' tUNUMBER '/' tUNUMBER */
|
case 22: /* date: tUNUMBER '/' tUNUMBER '/' tUNUMBER */
|
||||||
#line 256 "getdate.y"
|
#line 254 "getdate.y"
|
||||||
{
|
{
|
||||||
/* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.
|
/* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.
|
||||||
The goal in recognizing YYYY/MM/DD is solely to support legacy
|
The goal in recognizing YYYY/MM/DD is solely to support legacy
|
||||||
@@ -1533,71 +1531,71 @@ yyreduce:
|
|||||||
yyYear = (yyvsp[0].Number);
|
yyYear = (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#line 1537 "getdate.c"
|
#line 1535 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 23: /* date: tUNUMBER tSNUMBER tSNUMBER */
|
case 23: /* date: tUNUMBER tSNUMBER tSNUMBER */
|
||||||
#line 274 "getdate.y"
|
#line 272 "getdate.y"
|
||||||
{
|
{
|
||||||
/* ISO 8601 format. yyyy-mm-dd. */
|
/* ISO 8601 format. yyyy-mm-dd. */
|
||||||
yyYear = (yyvsp[-2].Number);
|
yyYear = (yyvsp[-2].Number);
|
||||||
yyMonth = -(yyvsp[-1].Number);
|
yyMonth = -(yyvsp[-1].Number);
|
||||||
yyDay = -(yyvsp[0].Number);
|
yyDay = -(yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1548 "getdate.c"
|
#line 1546 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 24: /* date: tUNUMBER tMONTH tSNUMBER */
|
case 24: /* date: tUNUMBER tMONTH tSNUMBER */
|
||||||
#line 280 "getdate.y"
|
#line 278 "getdate.y"
|
||||||
{
|
{
|
||||||
/* e.g. 17-JUN-1992. */
|
/* e.g. 17-JUN-1992. */
|
||||||
yyDay = (yyvsp[-2].Number);
|
yyDay = (yyvsp[-2].Number);
|
||||||
yyMonth = (yyvsp[-1].Number);
|
yyMonth = (yyvsp[-1].Number);
|
||||||
yyYear = -(yyvsp[0].Number);
|
yyYear = -(yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1559 "getdate.c"
|
#line 1557 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25: /* date: tMONTH tUNUMBER */
|
case 25: /* date: tMONTH tUNUMBER */
|
||||||
#line 286 "getdate.y"
|
#line 284 "getdate.y"
|
||||||
{
|
{
|
||||||
yyMonth = (yyvsp[-1].Number);
|
yyMonth = (yyvsp[-1].Number);
|
||||||
yyDay = (yyvsp[0].Number);
|
yyDay = (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1568 "getdate.c"
|
#line 1566 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 26: /* date: tMONTH tUNUMBER ',' tUNUMBER */
|
case 26: /* date: tMONTH tUNUMBER ',' tUNUMBER */
|
||||||
#line 290 "getdate.y"
|
#line 288 "getdate.y"
|
||||||
{
|
{
|
||||||
yyMonth = (yyvsp[-3].Number);
|
yyMonth = (yyvsp[-3].Number);
|
||||||
yyDay = (yyvsp[-2].Number);
|
yyDay = (yyvsp[-2].Number);
|
||||||
yyYear = (yyvsp[0].Number);
|
yyYear = (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1578 "getdate.c"
|
#line 1576 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 27: /* date: tUNUMBER tMONTH */
|
case 27: /* date: tUNUMBER tMONTH */
|
||||||
#line 295 "getdate.y"
|
#line 293 "getdate.y"
|
||||||
{
|
{
|
||||||
yyMonth = (yyvsp[0].Number);
|
yyMonth = (yyvsp[0].Number);
|
||||||
yyDay = (yyvsp[-1].Number);
|
yyDay = (yyvsp[-1].Number);
|
||||||
}
|
}
|
||||||
#line 1587 "getdate.c"
|
#line 1585 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 28: /* date: tUNUMBER tMONTH tUNUMBER */
|
case 28: /* date: tUNUMBER tMONTH tUNUMBER */
|
||||||
#line 299 "getdate.y"
|
#line 297 "getdate.y"
|
||||||
{
|
{
|
||||||
yyMonth = (yyvsp[-1].Number);
|
yyMonth = (yyvsp[-1].Number);
|
||||||
yyDay = (yyvsp[-2].Number);
|
yyDay = (yyvsp[-2].Number);
|
||||||
yyYear = (yyvsp[0].Number);
|
yyYear = (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1597 "getdate.c"
|
#line 1595 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29: /* rel: relunit tAGO */
|
case 29: /* rel: relunit tAGO */
|
||||||
#line 306 "getdate.y"
|
#line 304 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelSeconds = -yyRelSeconds;
|
yyRelSeconds = -yyRelSeconds;
|
||||||
yyRelMinutes = -yyRelMinutes;
|
yyRelMinutes = -yyRelMinutes;
|
||||||
@@ -1606,155 +1604,155 @@ yyreduce:
|
|||||||
yyRelMonth = -yyRelMonth;
|
yyRelMonth = -yyRelMonth;
|
||||||
yyRelYear = -yyRelYear;
|
yyRelYear = -yyRelYear;
|
||||||
}
|
}
|
||||||
#line 1610 "getdate.c"
|
#line 1608 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 31: /* relunit: tUNUMBER tYEAR_UNIT */
|
case 31: /* relunit: tUNUMBER tYEAR_UNIT */
|
||||||
#line 317 "getdate.y"
|
#line 315 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelYear += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelYear += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1618 "getdate.c"
|
#line 1616 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32: /* relunit: tSNUMBER tYEAR_UNIT */
|
case 32: /* relunit: tSNUMBER tYEAR_UNIT */
|
||||||
#line 320 "getdate.y"
|
#line 318 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelYear += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelYear += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1626 "getdate.c"
|
#line 1624 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 33: /* relunit: tYEAR_UNIT */
|
case 33: /* relunit: tYEAR_UNIT */
|
||||||
#line 323 "getdate.y"
|
#line 321 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelYear++;
|
yyRelYear += (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1634 "getdate.c"
|
#line 1632 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 34: /* relunit: tUNUMBER tMONTH_UNIT */
|
case 34: /* relunit: tUNUMBER tMONTH_UNIT */
|
||||||
#line 326 "getdate.y"
|
#line 324 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelMonth += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelMonth += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1642 "getdate.c"
|
#line 1640 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 35: /* relunit: tSNUMBER tMONTH_UNIT */
|
case 35: /* relunit: tSNUMBER tMONTH_UNIT */
|
||||||
#line 329 "getdate.y"
|
#line 327 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelMonth += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelMonth += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1650 "getdate.c"
|
#line 1648 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 36: /* relunit: tMONTH_UNIT */
|
case 36: /* relunit: tMONTH_UNIT */
|
||||||
#line 332 "getdate.y"
|
#line 330 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelMonth++;
|
yyRelMonth += (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1658 "getdate.c"
|
#line 1656 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 37: /* relunit: tUNUMBER tDAY_UNIT */
|
case 37: /* relunit: tUNUMBER tDAY_UNIT */
|
||||||
#line 335 "getdate.y"
|
#line 333 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelDay += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelDay += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1666 "getdate.c"
|
#line 1664 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 38: /* relunit: tSNUMBER tDAY_UNIT */
|
case 38: /* relunit: tSNUMBER tDAY_UNIT */
|
||||||
#line 338 "getdate.y"
|
#line 336 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelDay += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelDay += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1674 "getdate.c"
|
#line 1672 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 39: /* relunit: tDAY_UNIT */
|
case 39: /* relunit: tDAY_UNIT */
|
||||||
#line 341 "getdate.y"
|
#line 339 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelDay++;
|
yyRelDay += (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1682 "getdate.c"
|
#line 1680 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 40: /* relunit: tUNUMBER tHOUR_UNIT */
|
case 40: /* relunit: tUNUMBER tHOUR_UNIT */
|
||||||
#line 344 "getdate.y"
|
#line 342 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelHour += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelHour += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1690 "getdate.c"
|
#line 1688 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 41: /* relunit: tSNUMBER tHOUR_UNIT */
|
case 41: /* relunit: tSNUMBER tHOUR_UNIT */
|
||||||
#line 347 "getdate.y"
|
#line 345 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelHour += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelHour += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1698 "getdate.c"
|
#line 1696 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 42: /* relunit: tHOUR_UNIT */
|
case 42: /* relunit: tHOUR_UNIT */
|
||||||
#line 350 "getdate.y"
|
#line 348 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelHour++;
|
yyRelHour += (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1706 "getdate.c"
|
#line 1704 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 43: /* relunit: tUNUMBER tMINUTE_UNIT */
|
case 43: /* relunit: tUNUMBER tMINUTE_UNIT */
|
||||||
#line 353 "getdate.y"
|
#line 351 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelMinutes += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelMinutes += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1714 "getdate.c"
|
#line 1712 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 44: /* relunit: tSNUMBER tMINUTE_UNIT */
|
case 44: /* relunit: tSNUMBER tMINUTE_UNIT */
|
||||||
#line 356 "getdate.y"
|
#line 354 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelMinutes += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelMinutes += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1722 "getdate.c"
|
#line 1720 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 45: /* relunit: tMINUTE_UNIT */
|
case 45: /* relunit: tMINUTE_UNIT */
|
||||||
#line 359 "getdate.y"
|
#line 357 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelMinutes++;
|
yyRelMinutes += (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1730 "getdate.c"
|
#line 1728 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 46: /* relunit: tUNUMBER tSEC_UNIT */
|
case 46: /* relunit: tUNUMBER tSEC_UNIT */
|
||||||
#line 362 "getdate.y"
|
#line 360 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelSeconds += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelSeconds += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1738 "getdate.c"
|
#line 1736 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 47: /* relunit: tSNUMBER tSEC_UNIT */
|
case 47: /* relunit: tSNUMBER tSEC_UNIT */
|
||||||
#line 365 "getdate.y"
|
#line 363 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelSeconds += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
yyRelSeconds += (yyvsp[-1].Number) * (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1746 "getdate.c"
|
#line 1744 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 48: /* relunit: tSEC_UNIT */
|
case 48: /* relunit: tSEC_UNIT */
|
||||||
#line 368 "getdate.y"
|
#line 366 "getdate.y"
|
||||||
{
|
{
|
||||||
yyRelSeconds++;
|
yyRelSeconds += (yyvsp[0].Number);
|
||||||
}
|
}
|
||||||
#line 1754 "getdate.c"
|
#line 1752 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 49: /* number: tUNUMBER */
|
case 49: /* number: tUNUMBER */
|
||||||
#line 374 "getdate.y"
|
#line 372 "getdate.y"
|
||||||
{
|
{
|
||||||
if ((yyHaveTime != 0) && (yyHaveDate != 0) && (yyHaveRel == 0))
|
if ((yyHaveTime != 0) && (yyHaveDate != 0) && (yyHaveRel == 0))
|
||||||
yyYear = (yyvsp[0].Number);
|
yyYear = (yyvsp[0].Number);
|
||||||
@@ -1785,27 +1783,27 @@ yyreduce:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#line 1789 "getdate.c"
|
#line 1787 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50: /* o_merid: %empty */
|
case 50: /* o_merid: %empty */
|
||||||
#line 407 "getdate.y"
|
#line 405 "getdate.y"
|
||||||
{
|
{
|
||||||
(yyval.Meridian) = MER24;
|
(yyval.Meridian) = MER24;
|
||||||
}
|
}
|
||||||
#line 1797 "getdate.c"
|
#line 1795 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 51: /* o_merid: tMERIDIAN */
|
case 51: /* o_merid: tMERIDIAN */
|
||||||
#line 411 "getdate.y"
|
#line 409 "getdate.y"
|
||||||
{
|
{
|
||||||
(yyval.Meridian) = (yyvsp[0].Meridian);
|
(yyval.Meridian) = (yyvsp[0].Meridian);
|
||||||
}
|
}
|
||||||
#line 1805 "getdate.c"
|
#line 1803 "getdate.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
#line 1809 "getdate.c"
|
#line 1807 "getdate.c"
|
||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
@@ -1998,7 +1996,7 @@ yyreturnlab:
|
|||||||
return yyresult;
|
return yyresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
#line 416 "getdate.y"
|
#line 414 "getdate.y"
|
||||||
|
|
||||||
|
|
||||||
/* Month and day table. */
|
/* Month and day table. */
|
||||||
@@ -2158,7 +2156,7 @@ static TABLE const MilitaryTable[] = {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int yyerror (unused const char *s)
|
static int yyerror (MAYBE_UNUSED const char *s)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -2511,11 +2509,8 @@ time_t get_date (const char *p, const time_t *now)
|
|||||||
|
|
||||||
#if defined (TEST)
|
#if defined (TEST)
|
||||||
|
|
||||||
/* ARGSUSED */
|
|
||||||
int
|
int
|
||||||
main (ac, av)
|
main(void)
|
||||||
int ac;
|
|
||||||
char *av[];
|
|
||||||
{
|
{
|
||||||
char buff[MAX_BUFF_LEN + 1];
|
char buff[MAX_BUFF_LEN + 1];
|
||||||
time_t d;
|
time_t d;
|
||||||
@@ -12,9 +12,6 @@
|
|||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
# ifdef FORCE_ALLOCA_H
|
|
||||||
# include <alloca.h>
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Since the code of getdate.y is not included in the Emacs executable
|
/* Since the code of getdate.y is not included in the Emacs executable
|
||||||
@@ -31,6 +28,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "attr.h"
|
||||||
#include "getdate.h"
|
#include "getdate.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -321,7 +319,7 @@ relunit : tUNUMBER tYEAR_UNIT {
|
|||||||
yyRelYear += $1 * $2;
|
yyRelYear += $1 * $2;
|
||||||
}
|
}
|
||||||
| tYEAR_UNIT {
|
| tYEAR_UNIT {
|
||||||
yyRelYear++;
|
yyRelYear += $1;
|
||||||
}
|
}
|
||||||
| tUNUMBER tMONTH_UNIT {
|
| tUNUMBER tMONTH_UNIT {
|
||||||
yyRelMonth += $1 * $2;
|
yyRelMonth += $1 * $2;
|
||||||
@@ -330,7 +328,7 @@ relunit : tUNUMBER tYEAR_UNIT {
|
|||||||
yyRelMonth += $1 * $2;
|
yyRelMonth += $1 * $2;
|
||||||
}
|
}
|
||||||
| tMONTH_UNIT {
|
| tMONTH_UNIT {
|
||||||
yyRelMonth++;
|
yyRelMonth += $1;
|
||||||
}
|
}
|
||||||
| tUNUMBER tDAY_UNIT {
|
| tUNUMBER tDAY_UNIT {
|
||||||
yyRelDay += $1 * $2;
|
yyRelDay += $1 * $2;
|
||||||
@@ -339,7 +337,7 @@ relunit : tUNUMBER tYEAR_UNIT {
|
|||||||
yyRelDay += $1 * $2;
|
yyRelDay += $1 * $2;
|
||||||
}
|
}
|
||||||
| tDAY_UNIT {
|
| tDAY_UNIT {
|
||||||
yyRelDay++;
|
yyRelDay += $1;
|
||||||
}
|
}
|
||||||
| tUNUMBER tHOUR_UNIT {
|
| tUNUMBER tHOUR_UNIT {
|
||||||
yyRelHour += $1 * $2;
|
yyRelHour += $1 * $2;
|
||||||
@@ -348,7 +346,7 @@ relunit : tUNUMBER tYEAR_UNIT {
|
|||||||
yyRelHour += $1 * $2;
|
yyRelHour += $1 * $2;
|
||||||
}
|
}
|
||||||
| tHOUR_UNIT {
|
| tHOUR_UNIT {
|
||||||
yyRelHour++;
|
yyRelHour += $1;
|
||||||
}
|
}
|
||||||
| tUNUMBER tMINUTE_UNIT {
|
| tUNUMBER tMINUTE_UNIT {
|
||||||
yyRelMinutes += $1 * $2;
|
yyRelMinutes += $1 * $2;
|
||||||
@@ -357,7 +355,7 @@ relunit : tUNUMBER tYEAR_UNIT {
|
|||||||
yyRelMinutes += $1 * $2;
|
yyRelMinutes += $1 * $2;
|
||||||
}
|
}
|
||||||
| tMINUTE_UNIT {
|
| tMINUTE_UNIT {
|
||||||
yyRelMinutes++;
|
yyRelMinutes += $1;
|
||||||
}
|
}
|
||||||
| tUNUMBER tSEC_UNIT {
|
| tUNUMBER tSEC_UNIT {
|
||||||
yyRelSeconds += $1 * $2;
|
yyRelSeconds += $1 * $2;
|
||||||
@@ -366,7 +364,7 @@ relunit : tUNUMBER tYEAR_UNIT {
|
|||||||
yyRelSeconds += $1 * $2;
|
yyRelSeconds += $1 * $2;
|
||||||
}
|
}
|
||||||
| tSEC_UNIT {
|
| tSEC_UNIT {
|
||||||
yyRelSeconds++;
|
yyRelSeconds += $1;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -572,7 +570,7 @@ static TABLE const MilitaryTable[] = {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int yyerror (unused const char *s)
|
static int yyerror (MAYBE_UNUSED const char *s)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -925,11 +923,8 @@ time_t get_date (const char *p, const time_t *now)
|
|||||||
|
|
||||||
#if defined (TEST)
|
#if defined (TEST)
|
||||||
|
|
||||||
/* ARGSUSED */
|
|
||||||
int
|
int
|
||||||
main (ac, av)
|
main(void)
|
||||||
int ac;
|
|
||||||
char *av[];
|
|
||||||
{
|
{
|
||||||
char buff[MAX_BUFF_LEN + 1];
|
char buff[MAX_BUFF_LEN + 1];
|
||||||
time_t d;
|
time_t d;
|
||||||
+64
-53
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@@ -20,8 +21,14 @@
|
|||||||
#ifdef USE_ECONF
|
#ifdef USE_ECONF
|
||||||
#include <libeconf.h>
|
#include <libeconf.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
|
#include "atoi/str2i.h"
|
||||||
#include "getdef.h"
|
#include "getdef.h"
|
||||||
#include "shadowlog_internal.h"
|
#include "shadowlog_internal.h"
|
||||||
|
#include "string/sprintf.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A configuration item definition.
|
* A configuration item definition.
|
||||||
*/
|
*/
|
||||||
@@ -33,7 +40,6 @@ struct itemdef {
|
|||||||
#define PAMDEFS \
|
#define PAMDEFS \
|
||||||
{"CHFN_AUTH", NULL}, \
|
{"CHFN_AUTH", NULL}, \
|
||||||
{"CHSH_AUTH", NULL}, \
|
{"CHSH_AUTH", NULL}, \
|
||||||
{"CRACKLIB_DICTPATH", NULL}, \
|
|
||||||
{"ENV_HZ", NULL}, \
|
{"ENV_HZ", NULL}, \
|
||||||
{"ENVIRON_FILE", NULL}, \
|
{"ENVIRON_FILE", NULL}, \
|
||||||
{"ENV_TZ", NULL}, \
|
{"ENV_TZ", NULL}, \
|
||||||
@@ -132,10 +138,8 @@ static struct itemdef def_table[] = {
|
|||||||
#ifndef USE_PAM
|
#ifndef USE_PAM
|
||||||
PAMDEFS
|
PAMDEFS
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_SYSLOG
|
|
||||||
{"SYSLOG_SG_ENAB", NULL},
|
{"SYSLOG_SG_ENAB", NULL},
|
||||||
{"SYSLOG_SU_ENAB", NULL},
|
{"SYSLOG_SU_ENAB", NULL},
|
||||||
#endif
|
|
||||||
#ifdef WITH_TCB
|
#ifdef WITH_TCB
|
||||||
{"TCB_AUTH_GROUP", NULL},
|
{"TCB_AUTH_GROUP", NULL},
|
||||||
{"TCB_SYMLINKS", NULL},
|
{"TCB_SYMLINKS", NULL},
|
||||||
@@ -173,7 +177,7 @@ static const char* def_fname = LOGINDEFS; /* login config defs file */
|
|||||||
static bool def_loaded = false; /* are defs already loaded? */
|
static bool def_loaded = false; /* are defs already loaded? */
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static /*@observer@*/ /*@null@*/struct itemdef *def_find (const char *);
|
static /*@observer@*/ /*@null@*/struct itemdef *def_find (const char *, const char *);
|
||||||
static void def_load (void);
|
static void def_load (void);
|
||||||
|
|
||||||
|
|
||||||
@@ -192,8 +196,8 @@ static void def_load (void);
|
|||||||
def_load ();
|
def_load ();
|
||||||
}
|
}
|
||||||
|
|
||||||
d = def_find (item);
|
d = def_find (item, NULL);
|
||||||
return ((NULL == d)? (const char *) NULL : d->value);
|
return (NULL == d) ? NULL : d->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -211,7 +215,7 @@ bool getdef_bool (const char *item)
|
|||||||
def_load ();
|
def_load ();
|
||||||
}
|
}
|
||||||
|
|
||||||
d = def_find (item);
|
d = def_find (item, NULL);
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
if ((NULL == d) || (NULL == d->value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -237,21 +241,21 @@ int getdef_num (const char *item, int dflt)
|
|||||||
def_load ();
|
def_load ();
|
||||||
}
|
}
|
||||||
|
|
||||||
d = def_find (item);
|
d = def_find (item, NULL);
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
if ((NULL == d) || (NULL == d->value)) {
|
||||||
return dflt;
|
return dflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (getlong (d->value, &val) == 0)
|
if ( (str2sl(&val, d->value) == -1)
|
||||||
|| (val > INT_MAX)
|
|| (val > INT_MAX)
|
||||||
|| (val < INT_MIN)) {
|
|| (val < -1)) {
|
||||||
fprintf (shadow_logfd,
|
fprintf (shadow_logfd,
|
||||||
_("configuration error - cannot parse %s value: '%s'"),
|
_("configuration error - cannot parse %s value: '%s'"),
|
||||||
item, d->value);
|
item, d->value);
|
||||||
return dflt;
|
return dflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (int) val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -272,12 +276,12 @@ unsigned int getdef_unum (const char *item, unsigned int dflt)
|
|||||||
def_load ();
|
def_load ();
|
||||||
}
|
}
|
||||||
|
|
||||||
d = def_find (item);
|
d = def_find (item, NULL);
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
if ((NULL == d) || (NULL == d->value)) {
|
||||||
return dflt;
|
return dflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (getlong (d->value, &val) == 0)
|
if ( (str2sl(&val, d->value) == -1)
|
||||||
|| (val < 0)
|
|| (val < 0)
|
||||||
|| (val > INT_MAX)) {
|
|| (val > INT_MAX)) {
|
||||||
fprintf (shadow_logfd,
|
fprintf (shadow_logfd,
|
||||||
@@ -286,7 +290,7 @@ unsigned int getdef_unum (const char *item, unsigned int dflt)
|
|||||||
return dflt;
|
return dflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (unsigned int) val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -307,12 +311,12 @@ long getdef_long (const char *item, long dflt)
|
|||||||
def_load ();
|
def_load ();
|
||||||
}
|
}
|
||||||
|
|
||||||
d = def_find (item);
|
d = def_find (item, NULL);
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
if ((NULL == d) || (NULL == d->value)) {
|
||||||
return dflt;
|
return dflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getlong (d->value, &val) == 0) {
|
if (str2sl(&val, d->value) == -1 || val < -1) {
|
||||||
fprintf (shadow_logfd,
|
fprintf (shadow_logfd,
|
||||||
_("configuration error - cannot parse %s value: '%s'"),
|
_("configuration error - cannot parse %s value: '%s'"),
|
||||||
item, d->value);
|
item, d->value);
|
||||||
@@ -339,12 +343,12 @@ unsigned long getdef_ulong (const char *item, unsigned long dflt)
|
|||||||
def_load ();
|
def_load ();
|
||||||
}
|
}
|
||||||
|
|
||||||
d = def_find (item);
|
d = def_find (item, NULL);
|
||||||
if ((NULL == d) || (NULL == d->value)) {
|
if ((NULL == d) || (NULL == d->value)) {
|
||||||
return dflt;
|
return dflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getulong (d->value, &val) == 0) {
|
if (str2ul(&val, d->value) == -1) {
|
||||||
fprintf (shadow_logfd,
|
fprintf (shadow_logfd,
|
||||||
_("configuration error - cannot parse %s value: '%s'"),
|
_("configuration error - cannot parse %s value: '%s'"),
|
||||||
item, d->value);
|
item, d->value);
|
||||||
@@ -359,7 +363,7 @@ unsigned long getdef_ulong (const char *item, unsigned long dflt)
|
|||||||
* (also used when loading the initial defaults)
|
* (also used when loading the initial defaults)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int putdef_str (const char *name, const char *value)
|
int putdef_str (const char *name, const char *value, const char *srcfile)
|
||||||
{
|
{
|
||||||
struct itemdef *d;
|
struct itemdef *d;
|
||||||
char *cp;
|
char *cp;
|
||||||
@@ -372,10 +376,9 @@ int putdef_str (const char *name, const char *value)
|
|||||||
* Locate the slot to save the value. If this parameter
|
* Locate the slot to save the value. If this parameter
|
||||||
* is unknown then "def_find" will print an err message.
|
* is unknown then "def_find" will print an err message.
|
||||||
*/
|
*/
|
||||||
d = def_find (name);
|
d = def_find (name, srcfile);
|
||||||
if (NULL == d) {
|
if (NULL == d)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save off the value.
|
* Save off the value.
|
||||||
@@ -399,9 +402,12 @@ int putdef_str (const char *name, const char *value)
|
|||||||
*
|
*
|
||||||
* Search through a table of configurable items to locate the
|
* Search through a table of configurable items to locate the
|
||||||
* specified configuration option.
|
* specified configuration option.
|
||||||
|
*
|
||||||
|
* If srcfile is not NULL, and the item is not found, then report an error saying
|
||||||
|
* the unknown item was used in this file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static /*@observer@*/ /*@null@*/struct itemdef *def_find (const char *name)
|
static /*@observer@*/ /*@null@*/struct itemdef *def_find (const char *name, const char *srcfile)
|
||||||
{
|
{
|
||||||
struct itemdef *ptr;
|
struct itemdef *ptr;
|
||||||
|
|
||||||
@@ -427,10 +433,11 @@ static /*@observer@*/ /*@null@*/struct itemdef *def_find (const char *name)
|
|||||||
fprintf (shadow_logfd,
|
fprintf (shadow_logfd,
|
||||||
_("configuration error - unknown item '%s' (notify administrator)\n"),
|
_("configuration error - unknown item '%s' (notify administrator)\n"),
|
||||||
name);
|
name);
|
||||||
SYSLOG ((LOG_CRIT, "unknown configuration item `%s'", name));
|
if (srcfile != NULL)
|
||||||
|
SYSLOG ((LOG_CRIT, "shadow: unknown configuration item '%s' in '%s'", name, srcfile));
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return (struct itemdef *) NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -442,21 +449,12 @@ out:
|
|||||||
void setdef_config_file (const char* file)
|
void setdef_config_file (const char* file)
|
||||||
{
|
{
|
||||||
#ifdef USE_ECONF
|
#ifdef USE_ECONF
|
||||||
size_t len;
|
char *cp;
|
||||||
char* cp;
|
|
||||||
|
|
||||||
len = strlen(file) + strlen(sysconfdir) + 2;
|
xasprintf(&cp, "%s/%s", file, sysconfdir);
|
||||||
cp = malloc(len);
|
|
||||||
if (cp == NULL)
|
|
||||||
exit (13);
|
|
||||||
snprintf(cp, len, "%s/%s", file, sysconfdir);
|
|
||||||
sysconfdir = cp;
|
sysconfdir = cp;
|
||||||
#ifdef VENDORDIR
|
#ifdef VENDORDIR
|
||||||
len = strlen(file) + strlen(vendordir) + 2;
|
xasprintf(&cp, "%s/%s", file, vendordir);
|
||||||
cp = malloc(len);
|
|
||||||
if (cp == NULL)
|
|
||||||
exit (13);
|
|
||||||
snprintf(cp, len, "%s/%s", file, vendordir);
|
|
||||||
vendordir = cp;
|
vendordir = cp;
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
@@ -470,18 +468,13 @@ void setdef_config_file (const char* file)
|
|||||||
* Loads the user-configured options from the default configuration file
|
* Loads the user-configured options from the default configuration file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef USE_ECONF
|
||||||
static void def_load (void)
|
static void def_load (void)
|
||||||
{
|
{
|
||||||
#ifdef USE_ECONF
|
|
||||||
econf_file *defs_file = NULL;
|
econf_file *defs_file = NULL;
|
||||||
econf_err error;
|
econf_err error;
|
||||||
char **keys;
|
char **keys;
|
||||||
size_t key_number;
|
size_t key_number;
|
||||||
#else
|
|
||||||
int i;
|
|
||||||
FILE *fp;
|
|
||||||
char buf[1024], *name, *value, *s;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the initialized flag.
|
* Set the initialized flag.
|
||||||
@@ -489,8 +482,6 @@ static void def_load (void)
|
|||||||
*/
|
*/
|
||||||
def_loaded = true;
|
def_loaded = true;
|
||||||
|
|
||||||
#ifdef USE_ECONF
|
|
||||||
|
|
||||||
error = econf_readDirs (&defs_file, vendordir, sysconfdir, "login", "defs", " \t", "#");
|
error = econf_readDirs (&defs_file, vendordir, sysconfdir, "login", "defs", " \t", "#");
|
||||||
if (error) {
|
if (error) {
|
||||||
if (error == ECONF_NOFILE)
|
if (error == ECONF_NOFILE)
|
||||||
@@ -510,7 +501,12 @@ static void def_load (void)
|
|||||||
for (size_t i = 0; i < key_number; i++) {
|
for (size_t i = 0; i < key_number; i++) {
|
||||||
char *value;
|
char *value;
|
||||||
|
|
||||||
econf_getStringValue(defs_file, NULL, keys[i], &value);
|
error = econf_getStringValue(defs_file, NULL, keys[i], &value);
|
||||||
|
if (error) {
|
||||||
|
SYSLOG ((LOG_CRIT, "failed reading key %zu from econf [%s]",
|
||||||
|
i, econf_errString(error)));
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Store the value in def_table.
|
* Store the value in def_table.
|
||||||
@@ -519,12 +515,27 @@ static void def_load (void)
|
|||||||
* The error was already reported to the user and to
|
* The error was already reported to the user and to
|
||||||
* syslog. The tools will just use their default values.
|
* syslog. The tools will just use their default values.
|
||||||
*/
|
*/
|
||||||
(void)putdef_str (keys[i], value);
|
(void)putdef_str (keys[i], value, econf_getPath(defs_file));
|
||||||
|
|
||||||
|
free(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
econf_free (keys);
|
econf_free (keys);
|
||||||
econf_free (defs_file);
|
econf_free (defs_file);
|
||||||
#else
|
}
|
||||||
|
#else /* USE_ECONF */
|
||||||
|
static void def_load (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
FILE *fp;
|
||||||
|
char buf[1024], *name, *value, *s;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the initialized flag.
|
||||||
|
* (do it early to prevent recursion in putdef_str())
|
||||||
|
*/
|
||||||
|
def_loaded = true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open the configuration definitions file.
|
* Open the configuration definitions file.
|
||||||
*/
|
*/
|
||||||
@@ -542,12 +553,12 @@ static void def_load (void)
|
|||||||
/*
|
/*
|
||||||
* Go through all of the lines in the file.
|
* Go through all of the lines in the file.
|
||||||
*/
|
*/
|
||||||
while (fgets (buf, (int) sizeof (buf), fp) != NULL) {
|
while (fgets (buf, sizeof (buf), fp) != NULL) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Trim trailing whitespace.
|
* Trim trailing whitespace.
|
||||||
*/
|
*/
|
||||||
for (i = (int) strlen (buf) - 1; i >= 0; --i) {
|
for (i = (ptrdiff_t) strlen (buf) - 1; i >= 0; --i) {
|
||||||
if (!isspace (buf[i])) {
|
if (!isspace (buf[i])) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -577,7 +588,7 @@ static void def_load (void)
|
|||||||
* The error was already reported to the user and to
|
* The error was already reported to the user and to
|
||||||
* syslog. The tools will just use their default values.
|
* syslog. The tools will just use their default values.
|
||||||
*/
|
*/
|
||||||
(void)putdef_str (name, value);
|
(void)putdef_str (name, value, def_fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ferror (fp) != 0) {
|
if (ferror (fp) != 0) {
|
||||||
@@ -588,8 +599,8 @@ static void def_load (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
(void) fclose (fp);
|
(void) fclose (fp);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif /* USE_ECONF */
|
||||||
|
|
||||||
|
|
||||||
#ifdef CKDEFS
|
#ifdef CKDEFS
|
||||||
@@ -602,7 +613,7 @@ int main (int argc, char **argv)
|
|||||||
def_load ();
|
def_load ();
|
||||||
|
|
||||||
for (i = 0; i < NUMDEFS; ++i) {
|
for (i = 0; i < NUMDEFS; ++i) {
|
||||||
d = def_find (def_table[i].name);
|
d = def_find (def_table[i].name, NULL);
|
||||||
if (NULL == d) {
|
if (NULL == d) {
|
||||||
printf ("error - lookup '%s' failed\n",
|
printf ("error - lookup '%s' failed\n",
|
||||||
def_table[i].name);
|
def_table[i].name);
|
||||||
|
|||||||
+1
-1
@@ -16,7 +16,7 @@ extern int getdef_num (const char *, int);
|
|||||||
extern unsigned long getdef_ulong (const char *, unsigned long);
|
extern unsigned long getdef_ulong (const char *, unsigned long);
|
||||||
extern unsigned int getdef_unum (const char *, unsigned int);
|
extern unsigned int getdef_unum (const char *, unsigned int);
|
||||||
extern /*@observer@*/ /*@null@*/const char *getdef_str (const char *);
|
extern /*@observer@*/ /*@null@*/const char *getdef_str (const char *);
|
||||||
extern int putdef_str (const char *, const char *);
|
extern int putdef_str (const char *, const char *, const char *);
|
||||||
extern void setdef_config_file (const char* file);
|
extern void setdef_config_file (const char* file);
|
||||||
|
|
||||||
/* default UMASK value if not specified in /etc/login.defs */
|
/* default UMASK value if not specified in /etc/login.defs */
|
||||||
|
|||||||
@@ -23,20 +23,20 @@
|
|||||||
*/
|
*/
|
||||||
extern /*@only@*//*@null@*/struct group *getgr_nam_gid (/*@null@*/const char *grname)
|
extern /*@only@*//*@null@*/struct group *getgr_nam_gid (/*@null@*/const char *grname)
|
||||||
{
|
{
|
||||||
long long int gid;
|
char *end;
|
||||||
char *endptr;
|
long long gid;
|
||||||
|
|
||||||
if (NULL == grname) {
|
if (NULL == grname) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
gid = strtoll (grname, &endptr, 10);
|
gid = strtoll(grname, &end, 10);
|
||||||
if ( ('\0' != *grname)
|
if ( ('\0' != *grname)
|
||||||
&& ('\0' == *endptr)
|
&& ('\0' == *end)
|
||||||
&& (ERANGE != errno)
|
&& (0 == errno)
|
||||||
&& (/*@+longintegral@*/gid == (gid_t)gid)/*@=longintegral@*/) {
|
&& (/*@+longintegral@*/gid == (gid_t)gid)/*@=longintegral@*/) {
|
||||||
return xgetgrgid ((gid_t) gid);
|
return xgetgrgid (gid);
|
||||||
}
|
}
|
||||||
return xgetgrnam (grname);
|
return xgetgrnam (grname);
|
||||||
}
|
}
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2007 - 2009, Nicolas François
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2008, Nicolas François
|
||||||
|
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#ident "$Id: $"
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "atoi/a2i.h"
|
||||||
|
#include "defines.h"
|
||||||
|
#include "prototypes.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse a range and indicate if the range is valid.
|
||||||
|
* Valid ranges are in the form:
|
||||||
|
* <long> -> min=max=long has_min has_max
|
||||||
|
* -<long> -> max=long !has_min has_max
|
||||||
|
* <long>- -> min=long has_min !has_max
|
||||||
|
* <long1>-<long2> -> min=long1 max=long2 has_min has_max
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
getrange(const char *range,
|
||||||
|
unsigned long *min, bool *has_min,
|
||||||
|
unsigned long *max, bool *has_max)
|
||||||
|
{
|
||||||
|
const char *end;
|
||||||
|
|
||||||
|
if (NULL == range)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
*min = 0;
|
||||||
|
*has_min = false;
|
||||||
|
*has_max = false;
|
||||||
|
|
||||||
|
if ('-' == range[0]) {
|
||||||
|
end = range + 1;
|
||||||
|
goto parse_max;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a2ul(min, range, &end, 10, 0, ULONG_MAX) == -1 && errno != ENOTSUP)
|
||||||
|
return -1;
|
||||||
|
*has_min = true;
|
||||||
|
|
||||||
|
switch (*end++) {
|
||||||
|
case '\0':
|
||||||
|
*has_max = true;
|
||||||
|
*max = *min;
|
||||||
|
return 0; /* <long> */
|
||||||
|
|
||||||
|
case '-':
|
||||||
|
if ('\0' == *end)
|
||||||
|
return 0; /* <long>- */
|
||||||
|
parse_max:
|
||||||
|
if (!isdigit((unsigned char) *end))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (a2ul(max, end, NULL, 10, *min, ULONG_MAX) == -1)
|
||||||
|
return -1;
|
||||||
|
*has_max = true;
|
||||||
|
|
||||||
|
return 0; /* <long>-<long>, or -<long> */
|
||||||
|
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2017, Chris Lamb
|
||||||
|
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#ident "$Id$"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "atoi/a2i.h"
|
||||||
|
#include "defines.h"
|
||||||
|
#include "prototypes.h"
|
||||||
|
#include "shadowlog.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* gettime() returns the time as the number of seconds since the Epoch
|
||||||
|
*
|
||||||
|
* Like time(), gettime() returns the time as the number of seconds since the
|
||||||
|
* Epoch, 1970-01-01 00:00:00 +0000 (UTC), except that if the SOURCE_DATE_EPOCH
|
||||||
|
* environment variable is exported it will use that instead.
|
||||||
|
*/
|
||||||
|
/*@observer@*/time_t
|
||||||
|
gettime(void)
|
||||||
|
{
|
||||||
|
char *source_date_epoch;
|
||||||
|
FILE *shadow_logfd = log_get_logfd();
|
||||||
|
time_t fallback, epoch;
|
||||||
|
|
||||||
|
fallback = time (NULL);
|
||||||
|
source_date_epoch = shadow_getenv ("SOURCE_DATE_EPOCH");
|
||||||
|
|
||||||
|
if (!source_date_epoch)
|
||||||
|
return fallback;
|
||||||
|
|
||||||
|
if (a2i(time_t, &epoch, source_date_epoch, NULL, 10, 0, fallback) == -1) {
|
||||||
|
fprintf(shadow_logfd,
|
||||||
|
_("Environment variable $SOURCE_DATE_EPOCH: a2i(\"%s\"): %s"),
|
||||||
|
source_date_epoch, strerror(errno));
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
return epoch;
|
||||||
|
}
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2007 - 2009, Nicolas François
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#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;
|
|
||||||
}
|
|
||||||
|
|
||||||
+35
-30
@@ -15,12 +15,14 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "commonio.h"
|
#include "commonio.h"
|
||||||
#include "getdef.h"
|
#include "getdef.h"
|
||||||
#include "groupio.h"
|
#include "groupio.h"
|
||||||
|
|
||||||
|
|
||||||
static /*@null@*/struct commonio_entry *merge_group_entries (
|
static /*@null@*/struct commonio_entry *merge_group_entries (
|
||||||
/*@null@*/ /*@returned@*/struct commonio_entry *gr1,
|
/*@null@*/ /*@returned@*/struct commonio_entry *gr1,
|
||||||
/*@null@*/struct commonio_entry *gr2);
|
/*@null@*/struct commonio_entry *gr2);
|
||||||
@@ -34,7 +36,8 @@ static /*@null@*/ /*@only@*/void *group_dup (const void *ent)
|
|||||||
return __gr_dup (gr);
|
return __gr_dup (gr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void group_free (/*@out@*/ /*@only@*/void *ent)
|
static void
|
||||||
|
group_free(/*@only@*/void *ent)
|
||||||
{
|
{
|
||||||
struct group *gr = ent;
|
struct group *gr = ent;
|
||||||
|
|
||||||
@@ -50,7 +53,7 @@ static const char *group_getname (const void *ent)
|
|||||||
|
|
||||||
static void *group_parse (const char *line)
|
static void *group_parse (const char *line)
|
||||||
{
|
{
|
||||||
return (void *) sgetgrent (line);
|
return sgetgrent (line);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int group_put (const void *ent, FILE * file)
|
static int group_put (const void *ent, FILE * file)
|
||||||
@@ -159,7 +162,7 @@ int gr_open (int mode)
|
|||||||
|
|
||||||
int gr_update (const struct group *gr)
|
int gr_update (const struct group *gr)
|
||||||
{
|
{
|
||||||
return commonio_update (&group_db, (const void *) gr);
|
return commonio_update (&group_db, gr);
|
||||||
}
|
}
|
||||||
|
|
||||||
int gr_remove (const char *name)
|
int gr_remove (const char *name)
|
||||||
@@ -209,17 +212,25 @@ void __gr_del_entry (const struct commonio_entry *ent)
|
|||||||
|
|
||||||
static int gr_cmp (const void *p1, const void *p2)
|
static int gr_cmp (const void *p1, const void *p2)
|
||||||
{
|
{
|
||||||
|
const struct commonio_entry *const *ce1;
|
||||||
|
const struct commonio_entry *const *ce2;
|
||||||
|
const struct group *g1, *g2;
|
||||||
gid_t u1, u2;
|
gid_t u1, u2;
|
||||||
|
|
||||||
if ((*(struct commonio_entry **) p1)->eptr == NULL) {
|
ce1 = p1;
|
||||||
|
g1 = (*ce1)->eptr;
|
||||||
|
if (g1 == NULL) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if ((*(struct commonio_entry **) p2)->eptr == NULL) {
|
|
||||||
|
ce2 = p2;
|
||||||
|
g2 = (*ce2)->eptr;
|
||||||
|
if (g2 == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
u1 = ((struct group *) (*(struct commonio_entry **) p1)->eptr)->gr_gid;
|
u1 = g1->gr_gid;
|
||||||
u2 = ((struct group *) (*(struct commonio_entry **) p2)->eptr)->gr_gid;
|
u2 = g2->gr_gid;
|
||||||
|
|
||||||
if (u1 < u2) {
|
if (u1 < u2) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -247,8 +258,8 @@ static int group_open_hook (void)
|
|||||||
|
|
||||||
for (gr1 = group_db.head; NULL != gr1; gr1 = gr1->next) {
|
for (gr1 = group_db.head; NULL != gr1; gr1 = gr1->next) {
|
||||||
for (gr2 = gr1->next; NULL != gr2; gr2 = gr2->next) {
|
for (gr2 = gr1->next; NULL != gr2; gr2 = gr2->next) {
|
||||||
struct group *g1 = (struct group *)gr1->eptr;
|
struct group *g1 = gr1->eptr;
|
||||||
struct group *g2 = (struct group *)gr2->eptr;
|
struct group *g2 = gr2->eptr;
|
||||||
if (NULL != g1 &&
|
if (NULL != g1 &&
|
||||||
NULL != g2 &&
|
NULL != g2 &&
|
||||||
0 == strcmp (g1->gr_name, g2->gr_name) &&
|
0 == strcmp (g1->gr_name, g2->gr_name) &&
|
||||||
@@ -291,32 +302,28 @@ static /*@null@*/struct commonio_entry *merge_group_entries (
|
|||||||
/*@null@*/ /*@returned@*/struct commonio_entry *gr1,
|
/*@null@*/ /*@returned@*/struct commonio_entry *gr1,
|
||||||
/*@null@*/struct commonio_entry *gr2)
|
/*@null@*/struct commonio_entry *gr2)
|
||||||
{
|
{
|
||||||
struct group *gptr1;
|
char *new_line;
|
||||||
struct group *gptr2;
|
char **new_members;
|
||||||
char **new_members;
|
size_t i;
|
||||||
size_t members = 0;
|
size_t members = 0;
|
||||||
char *new_line;
|
struct group *gptr1;
|
||||||
size_t new_line_len, i;
|
struct group *gptr2;
|
||||||
|
|
||||||
if (NULL == gr2 || NULL == gr1) {
|
if (NULL == gr2 || NULL == gr1) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
gptr1 = (struct group *)gr1->eptr;
|
gptr1 = gr1->eptr;
|
||||||
gptr2 = (struct group *)gr2->eptr;
|
gptr2 = gr2->eptr;
|
||||||
if (NULL == gptr2 || NULL == gptr1) {
|
if (NULL == gptr2 || NULL == gptr1) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Concatenate the 2 lines */
|
/* Concatenate the 2 lines */
|
||||||
new_line_len = strlen (gr1->line) + strlen (gr2->line) +1;
|
if (asprintf(&new_line, "%s\n%s", gr1->line, gr2->line) == -1)
|
||||||
new_line = (char *)malloc (new_line_len + 1);
|
|
||||||
if (NULL == new_line) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
snprintf(new_line, new_line_len + 1, "%s\n%s", gr1->line, gr2->line);
|
|
||||||
|
|
||||||
/* Concatenate the 2 list of members */
|
/* Concatenate the 2 list of members */
|
||||||
for (i=0; NULL != gptr1->gr_mem[i]; i++);
|
for (i=0; NULL != gptr1->gr_mem[i]; i++);
|
||||||
@@ -333,10 +340,9 @@ static /*@null@*/struct commonio_entry *merge_group_entries (
|
|||||||
members++;
|
members++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new_members = (char **)calloc ( (members+1), sizeof(char*) );
|
new_members = CALLOC (members + 1, char *);
|
||||||
if (NULL == new_members) {
|
if (NULL == new_members) {
|
||||||
free (new_line);
|
free(new_line);
|
||||||
errno = ENOMEM;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (i=0; NULL != gptr1->gr_mem[i]; i++) {
|
for (i=0; NULL != gptr1->gr_mem[i]; i++) {
|
||||||
@@ -377,7 +383,7 @@ static int split_groups (unsigned int max_members)
|
|||||||
struct commonio_entry *gr;
|
struct commonio_entry *gr;
|
||||||
|
|
||||||
for (gr = group_db.head; NULL != gr; gr = gr->next) {
|
for (gr = group_db.head; NULL != gr; gr = gr->next) {
|
||||||
struct group *gptr = (struct group *)gr->eptr;
|
struct group *gptr = gr->eptr;
|
||||||
struct commonio_entry *new;
|
struct commonio_entry *new;
|
||||||
struct group *new_gptr;
|
struct group *new_gptr;
|
||||||
unsigned int members = 0;
|
unsigned int members = 0;
|
||||||
@@ -395,9 +401,8 @@ static int split_groups (unsigned int max_members)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
new = (struct commonio_entry *) malloc (sizeof *new);
|
new = MALLOC(1, struct commonio_entry);
|
||||||
if (NULL == new) {
|
if (NULL == new) {
|
||||||
errno = ENOMEM;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
new->eptr = group_dup(gr->eptr);
|
new->eptr = group_dup(gr->eptr);
|
||||||
@@ -406,7 +411,7 @@ static int split_groups (unsigned int max_members)
|
|||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
new_gptr = (struct group *)new->eptr;
|
new_gptr = new->eptr;
|
||||||
new->line = NULL;
|
new->line = NULL;
|
||||||
new->changed = true;
|
new->changed = true;
|
||||||
|
|
||||||
|
|||||||
+6
-34
@@ -12,6 +12,8 @@
|
|||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
|
#include "memzero.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "groupio.h"
|
#include "groupio.h"
|
||||||
@@ -21,12 +23,11 @@
|
|||||||
struct group *gr;
|
struct group *gr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
gr = (struct group *) malloc (sizeof *gr);
|
gr = CALLOC(1, struct group);
|
||||||
if (NULL == gr) {
|
if (NULL == gr) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/* The libc might define other fields. They won't be copied. */
|
/* The libc might define other fields. They won't be copied. */
|
||||||
memset (gr, 0, sizeof *gr);
|
|
||||||
gr->gr_gid = grent->gr_gid;
|
gr->gr_gid = grent->gr_gid;
|
||||||
/*@-mustfreeonly@*/
|
/*@-mustfreeonly@*/
|
||||||
gr->gr_name = strdup (grent->gr_name);
|
gr->gr_name = strdup (grent->gr_name);
|
||||||
@@ -46,7 +47,7 @@
|
|||||||
for (i = 0; grent->gr_mem[i]; i++);
|
for (i = 0; grent->gr_mem[i]; i++);
|
||||||
|
|
||||||
/*@-mustfreeonly@*/
|
/*@-mustfreeonly@*/
|
||||||
gr->gr_mem = (char **) malloc ((i + 1) * sizeof (char *));
|
gr->gr_mem = MALLOC(i + 1, char *);
|
||||||
/*@=mustfreeonly@*/
|
/*@=mustfreeonly@*/
|
||||||
if (NULL == gr->gr_mem) {
|
if (NULL == gr->gr_mem) {
|
||||||
gr_free(gr);
|
gr_free(gr);
|
||||||
@@ -76,7 +77,8 @@ void gr_free_members (struct group *grent)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gr_free (/*@out@*/ /*@only@*/struct group *grent)
|
void
|
||||||
|
gr_free(/*@only@*/struct group *grent)
|
||||||
{
|
{
|
||||||
free (grent->gr_name);
|
free (grent->gr_name);
|
||||||
if (NULL != grent->gr_passwd) {
|
if (NULL != grent->gr_passwd) {
|
||||||
@@ -86,33 +88,3 @@ void gr_free (/*@out@*/ /*@only@*/struct group *grent)
|
|||||||
gr_free_members(grent);
|
gr_free_members(grent);
|
||||||
free (grent);
|
free (grent);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool gr_append_member(struct group *grp, char *member)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (NULL == grp->gr_mem || grp->gr_mem[0] == NULL) {
|
|
||||||
grp->gr_mem = (char **)malloc(2 * sizeof(char *));
|
|
||||||
if (!grp->gr_mem) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
grp->gr_mem[0] = strdup(member);
|
|
||||||
if (!grp->gr_mem[0]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
grp->gr_mem[1] = NULL;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; grp->gr_mem[i]; i++) ;
|
|
||||||
grp->gr_mem = realloc(grp->gr_mem, (i + 2) * sizeof(char *));
|
|
||||||
if (NULL == grp->gr_mem) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
grp->gr_mem[i] = strdup(member);
|
|
||||||
if (NULL == grp->gr_mem[i]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
grp->gr_mem[i + 1] = NULL;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
+19
-212
@@ -15,8 +15,12 @@
|
|||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
static /*@null@*/FILE *shadow;
|
static /*@null@*/FILE *shadow;
|
||||||
static /*@null@*//*@only@*/char **members = NULL;
|
static /*@null@*//*@only@*/char **members = NULL;
|
||||||
static size_t nmembers = 0;
|
static size_t nmembers = 0;
|
||||||
@@ -26,34 +30,6 @@ static struct sgrp sgroup;
|
|||||||
|
|
||||||
#define FIELDS 4
|
#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)
|
static /*@null@*/char **build_list (char *s, char **list[], size_t * nlist)
|
||||||
{
|
{
|
||||||
@@ -62,21 +38,16 @@ static /*@null@*/char **build_list (char *s, char **list[], size_t * nlist)
|
|||||||
|
|
||||||
while (s != NULL && *s != '\0') {
|
while (s != NULL && *s != '\0') {
|
||||||
size = (nelem + 1) * sizeof (ptr);
|
size = (nelem + 1) * sizeof (ptr);
|
||||||
ptr = realloc (*list, size);
|
ptr = REALLOC(*list, size, char *);
|
||||||
if (NULL != ptr) {
|
if (NULL != ptr) {
|
||||||
ptr[nelem] = s;
|
ptr[nelem] = strsep(&s, ",");
|
||||||
nelem++;
|
nelem++;
|
||||||
*list = ptr;
|
*list = ptr;
|
||||||
*nlist = nelem;
|
*nlist = nelem;
|
||||||
s = strchr (s, ',');
|
|
||||||
if (NULL != s) {
|
|
||||||
*s = '\0';
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
size = (nelem + 1) * sizeof (ptr);
|
size = (nelem + 1) * sizeof (ptr);
|
||||||
ptr = realloc (*list, size);
|
ptr = REALLOC(*list, size, char *);
|
||||||
if (NULL != ptr) {
|
if (NULL != ptr) {
|
||||||
ptr[nelem] = NULL;
|
ptr[nelem] = NULL;
|
||||||
*list = ptr;
|
*list = ptr;
|
||||||
@@ -86,9 +57,6 @@ static /*@null@*/char **build_list (char *s, char **list[], size_t * nlist)
|
|||||||
|
|
||||||
void setsgent (void)
|
void setsgent (void)
|
||||||
{
|
{
|
||||||
#ifdef USE_NIS
|
|
||||||
nis_state = native;
|
|
||||||
#endif
|
|
||||||
if (NULL != shadow) {
|
if (NULL != shadow) {
|
||||||
rewind (shadow);
|
rewind (shadow);
|
||||||
} else {
|
} else {
|
||||||
@@ -102,7 +70,7 @@ void endsgent (void)
|
|||||||
(void) fclose (shadow);
|
(void) fclose (shadow);
|
||||||
}
|
}
|
||||||
|
|
||||||
shadow = (FILE *) 0;
|
shadow = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *sgetsgent (const char *string)
|
/*@observer@*//*@null@*/struct sgrp *sgetsgent (const char *string)
|
||||||
@@ -116,7 +84,7 @@ void endsgent (void)
|
|||||||
size_t len = strlen (string) + 1;
|
size_t len = strlen (string) + 1;
|
||||||
|
|
||||||
if (len > sgrbuflen) {
|
if (len > sgrbuflen) {
|
||||||
char *buf = (char *) realloc (sgrbuf, sizeof (char) * len);
|
char *buf = REALLOC(sgrbuf, len, char);
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -124,8 +92,7 @@ void endsgent (void)
|
|||||||
sgrbuflen = len;
|
sgrbuflen = len;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy (sgrbuf, string, len);
|
strcpy (sgrbuf, string);
|
||||||
sgrbuf[len-1] = '\0';
|
|
||||||
|
|
||||||
cp = strrchr (sgrbuf, '\n');
|
cp = strrchr (sgrbuf, '\n');
|
||||||
if (NULL != cp) {
|
if (NULL != cp) {
|
||||||
@@ -137,30 +104,16 @@ void endsgent (void)
|
|||||||
* all 4 of them and save the starting addresses in fields[].
|
* all 4 of them and save the starting addresses in fields[].
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (cp = sgrbuf, i = 0; (i < FIELDS) && (NULL != cp); i++) {
|
for (cp = sgrbuf, i = 0; (i < FIELDS) && (NULL != cp); i++)
|
||||||
fields[i] = cp;
|
fields[i] = strsep(&cp, ":");
|
||||||
cp = strchr (cp, ':');
|
|
||||||
if (NULL != cp) {
|
|
||||||
*cp++ = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there was an extra field somehow, or perhaps not enough,
|
* If there was an extra field somehow, or perhaps not enough,
|
||||||
* the line is invalid.
|
* the line is invalid.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ((NULL != cp) || (i != FIELDS)) {
|
if (NULL != cp || i != FIELDS)
|
||||||
#ifdef USE_NIS
|
|
||||||
if (!IS_NISCHAR (fields[0][0])) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
nis_used = true;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
sgroup.sg_name = fields[0];
|
sgroup.sg_name = fields[0];
|
||||||
sgroup.sg_passwd = fields[1];
|
sgroup.sg_passwd = fields[1];
|
||||||
@@ -195,7 +148,7 @@ void endsgent (void)
|
|||||||
char *cp;
|
char *cp;
|
||||||
|
|
||||||
if (0 == buflen) {
|
if (0 == buflen) {
|
||||||
buf = (char *) malloc (BUFSIZ);
|
buf = MALLOC(BUFSIZ, char);
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -206,17 +159,12 @@ void endsgent (void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_NIS
|
if (fgetsx(buf, buflen, fp) == buf) {
|
||||||
while (fgetsx (buf, (int) buflen, fp) == buf)
|
|
||||||
#else
|
|
||||||
if (fgetsx (buf, (int) buflen, fp) == buf)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
while ( ((cp = strrchr (buf, '\n')) == NULL)
|
while ( ((cp = strrchr (buf, '\n')) == NULL)
|
||||||
&& (feof (fp) == 0)) {
|
&& (feof (fp) == 0)) {
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
cp = (char *) realloc (buf, buflen*2);
|
cp = REALLOC(buf, buflen * 2, char);
|
||||||
if (NULL == cp) {
|
if (NULL == cp) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -234,11 +182,6 @@ void endsgent (void)
|
|||||||
if (NULL != cp) {
|
if (NULL != cp) {
|
||||||
*cp = '\0';
|
*cp = '\0';
|
||||||
}
|
}
|
||||||
#ifdef USE_NIS
|
|
||||||
if (nis_ignore && IS_NISCHAR (buf[0])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return (sgetsgent (buf));
|
return (sgetsgent (buf));
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -250,96 +193,10 @@ void endsgent (void)
|
|||||||
|
|
||||||
/*@observer@*//*@null@*/struct sgrp *getsgent (void)
|
/*@observer@*//*@null@*/struct sgrp *getsgent (void)
|
||||||
{
|
{
|
||||||
#ifdef USE_NIS
|
|
||||||
bool nis_1_group = false;
|
|
||||||
struct sgrp *val;
|
|
||||||
#endif
|
|
||||||
if (NULL == shadow) {
|
if (NULL == shadow) {
|
||||||
setsgent ();
|
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));
|
return (fgetsgent (shadow));
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -350,63 +207,13 @@ void endsgent (void)
|
|||||||
{
|
{
|
||||||
struct sgrp *sgrp;
|
struct sgrp *sgrp;
|
||||||
|
|
||||||
#ifdef USE_NIS
|
|
||||||
static char save_name[16];
|
|
||||||
int nis_disabled = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
setsgent ();
|
setsgent ();
|
||||||
|
|
||||||
#ifdef USE_NIS
|
while ((sgrp = getsgent ()) != NULL) {
|
||||||
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) {
|
if (strcmp (name, sgrp->sg_name) == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef USE_NIS
|
|
||||||
nis_ignore = false;
|
|
||||||
#endif
|
|
||||||
return sgrp;
|
return sgrp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,7 +244,7 @@ int putsgent (const struct sgrp *sgrp, FILE * fp)
|
|||||||
size += strlen (sgrp->sg_mem[i]) + 1;
|
size += strlen (sgrp->sg_mem[i]) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = malloc (size);
|
buf = MALLOC(size, char);
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -502,5 +309,5 @@ int putsgent (const struct sgrp *sgrp, FILE * fp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
extern int errno; /* warning: ANSI C forbids an empty source file */
|
extern int ISO_C_forbids_an_empty_translation_unit;
|
||||||
#endif /*} SHADOWGRP */
|
#endif /*} SHADOWGRP */
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user