[svn-upgrade] Integrating new upstream version, shadow (19990709)
This commit is contained in:
226
ABOUT-NLS
Normal file
226
ABOUT-NLS
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
Notes on the Free Translation Project
|
||||||
|
*************************************
|
||||||
|
|
||||||
|
Free software is going international! The Free Translation Project
|
||||||
|
is a way to get maintainers of free software, translators, and users all
|
||||||
|
together, so that will gradually become able to speak many languages.
|
||||||
|
A few packages already provide translations for their messages.
|
||||||
|
|
||||||
|
If you found this `ABOUT-NLS' file inside a distribution, you may
|
||||||
|
assume that the distributed package does use GNU `gettext' internally,
|
||||||
|
itself available at your nearest GNU archive site. But you do *not*
|
||||||
|
need to install GNU `gettext' prior to configuring, installing or using
|
||||||
|
this package with messages translated.
|
||||||
|
|
||||||
|
Installers will find here some useful hints. These notes also
|
||||||
|
explain how users should proceed for getting the programs to use the
|
||||||
|
available translations. They tell how people wanting to contribute and
|
||||||
|
work at translations should contact the appropriate team.
|
||||||
|
|
||||||
|
When reporting bugs in the `intl/' directory or bugs which may be
|
||||||
|
related to internationalization, you should tell about the version of
|
||||||
|
`gettext' which is used. The information can be found in the
|
||||||
|
`intl/VERSION' file, in internationalized packages.
|
||||||
|
|
||||||
|
One advise in advance
|
||||||
|
=====================
|
||||||
|
|
||||||
|
If you want to exploit the full power of internationalization, you
|
||||||
|
should configure it using
|
||||||
|
|
||||||
|
./configure --with-included-gettext
|
||||||
|
|
||||||
|
to force usage of internationalizing routines provided within this
|
||||||
|
package, despite the existence of internationalizing capabilities in the
|
||||||
|
operating system where this package is being installed. So far, only
|
||||||
|
the `gettext' implementation in the GNU C library version 2 provides as
|
||||||
|
many features (such as locale alias or message inheritance) as the
|
||||||
|
implementation here. It is also not possible to offer this additional
|
||||||
|
functionality on top of a `catgets' implementation. Future versions of
|
||||||
|
GNU `gettext' will very likely convey even more functionality. So it
|
||||||
|
might be a good idea to change to GNU `gettext' as soon as possible.
|
||||||
|
|
||||||
|
So you need not provide this option if you are using GNU libc 2 or
|
||||||
|
you have installed a recent copy of the GNU gettext package with the
|
||||||
|
included `libintl'.
|
||||||
|
|
||||||
|
INSTALL Matters
|
||||||
|
===============
|
||||||
|
|
||||||
|
Some packages are "localizable" when properly installed; the
|
||||||
|
programs they contain can be made to speak your own native language.
|
||||||
|
Most such packages use GNU `gettext'. Other packages have their own
|
||||||
|
ways to internationalization, predating GNU `gettext'.
|
||||||
|
|
||||||
|
By default, this package will be installed to allow translation of
|
||||||
|
messages. It will automatically detect whether the system provides
|
||||||
|
usable `catgets' (if using this is selected by the installer) or
|
||||||
|
`gettext' functions. If neither is available, the GNU `gettext' own
|
||||||
|
library will be used. This library is wholly contained within this
|
||||||
|
package, usually in the `intl/' subdirectory, so prior installation of
|
||||||
|
the GNU `gettext' package is *not* required. Installers may use
|
||||||
|
special options at configuration time for changing the default
|
||||||
|
behaviour. The commands:
|
||||||
|
|
||||||
|
./configure --with-included-gettext
|
||||||
|
./configure --with-catgets
|
||||||
|
./configure --disable-nls
|
||||||
|
|
||||||
|
will respectively bypass any pre-existing `catgets' or `gettext' to use
|
||||||
|
the internationalizing routines provided within this package, enable
|
||||||
|
the use of the `catgets' functions (if found on the locale system), or
|
||||||
|
else, *totally* disable translation of messages.
|
||||||
|
|
||||||
|
When you already have GNU `gettext' installed on your system and run
|
||||||
|
configure without an option for your new package, `configure' will
|
||||||
|
probably detect the previously built and installed `libintl.a' file and
|
||||||
|
will decide to use this. This might be not what is desirable. You
|
||||||
|
should use the more recent version of the GNU `gettext' library. I.e.
|
||||||
|
if the file `intl/VERSION' shows that the library which comes with this
|
||||||
|
package is more recent, you should use
|
||||||
|
|
||||||
|
./configure --with-included-gettext
|
||||||
|
|
||||||
|
to prevent auto-detection.
|
||||||
|
|
||||||
|
By default the configuration process will not test for the `catgets'
|
||||||
|
function and therefore they will not be used. The reasons are already
|
||||||
|
given above: the emulation on top of `catgets' cannot provide all the
|
||||||
|
extensions provided by the GNU `gettext' library. If you nevertheless
|
||||||
|
want to use the `catgets' functions use
|
||||||
|
|
||||||
|
./configure --with-catgets
|
||||||
|
|
||||||
|
to enable the test for `catgets' (this causes no harm if `catgets' is
|
||||||
|
not available on your system). If you really select this option we
|
||||||
|
would like to hear about the reasons because we cannot think of any
|
||||||
|
good one ourself.
|
||||||
|
|
||||||
|
Internationalized packages have usually many `po/LL.po' files, where
|
||||||
|
LL gives an ISO 639 two-letter code identifying the language. Unless
|
||||||
|
translations have been forbidden at `configure' time by using the
|
||||||
|
`--disable-nls' switch, all available translations are installed
|
||||||
|
together with the package. However, the environment variable `LINGUAS'
|
||||||
|
may be set, prior to configuration, to limit the installed set.
|
||||||
|
`LINGUAS' should then contain a space separated list of two-letter
|
||||||
|
codes, stating which languages are allowed.
|
||||||
|
|
||||||
|
Using This Package
|
||||||
|
==================
|
||||||
|
|
||||||
|
As a user, if your language has been installed for this package, you
|
||||||
|
only have to set the `LANG' environment variable to the appropriate
|
||||||
|
ISO 639 `LL' two-letter code prior to using the programs in the
|
||||||
|
package. For example, let's suppose that you speak German. At the
|
||||||
|
shell prompt, merely execute `setenv LANG de' (in `csh'),
|
||||||
|
`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This
|
||||||
|
can be done from your `.login' or `.profile' file, once and for all.
|
||||||
|
|
||||||
|
An operating system might already offer message localization for
|
||||||
|
many of its programs, while other programs have been installed locally
|
||||||
|
with the full capabilities of GNU `gettext'. Just using `gettext'
|
||||||
|
extended syntax for `LANG' would break proper localization of already
|
||||||
|
available operating system programs. In this case, users should set
|
||||||
|
both `LANGUAGE' and `LANG' variables in their environment, as programs
|
||||||
|
using GNU `gettext' give preference to `LANGUAGE'. For example, some
|
||||||
|
Swedish users would rather read translations in German than English for
|
||||||
|
when Swedish is not available. This is easily accomplished by setting
|
||||||
|
`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'.
|
||||||
|
|
||||||
|
Translating Teams
|
||||||
|
=================
|
||||||
|
|
||||||
|
For the Free Translation Project to be a success, we need interested
|
||||||
|
people who like their own language and write it well, and who are also
|
||||||
|
able to synergize with other translators speaking the same language.
|
||||||
|
Each translation team has its own mailing list, courtesy of Linux
|
||||||
|
International. You may reach your translation team at the address
|
||||||
|
`LL@li.org', replacing LL by the two-letter ISO 639 code for your
|
||||||
|
language. Language codes are *not* the same as the country codes given
|
||||||
|
in ISO 3166. The following translation teams exist, as of December
|
||||||
|
1997:
|
||||||
|
|
||||||
|
Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en',
|
||||||
|
Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian
|
||||||
|
`hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja',
|
||||||
|
Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish
|
||||||
|
`pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es',
|
||||||
|
Swedish `sv', and Turkish `tr'.
|
||||||
|
|
||||||
|
For example, you may reach the Chinese translation team by writing to
|
||||||
|
`zh@li.org'.
|
||||||
|
|
||||||
|
If you'd like to volunteer to *work* at translating messages, you
|
||||||
|
should become a member of the translating team for your own language.
|
||||||
|
The subscribing address is *not* the same as the list itself, it has
|
||||||
|
`-request' appended. For example, speakers of Swedish can send a
|
||||||
|
message to `sv-request@li.org', having this message body:
|
||||||
|
|
||||||
|
subscribe
|
||||||
|
|
||||||
|
Keep in mind that team members are expected to participate
|
||||||
|
*actively* in translations, or at solving translational difficulties,
|
||||||
|
rather than merely lurking around. If your team does not exist yet and
|
||||||
|
you want to start one, or if you are unsure about what to do or how to
|
||||||
|
get started, please write to `translation@iro.umontreal.ca' to reach the
|
||||||
|
coordinator for all translator teams.
|
||||||
|
|
||||||
|
The English team is special. It works at improving and uniformizing
|
||||||
|
the terminology in use. Proven linguistic skill are praised more than
|
||||||
|
programming skill, here.
|
||||||
|
|
||||||
|
Available Packages
|
||||||
|
==================
|
||||||
|
|
||||||
|
Languages are not equally supported in all packages. The following
|
||||||
|
matrix shows the current state of internationalization, as of December
|
||||||
|
1997. The matrix shows, in regard of each package, for which languages
|
||||||
|
PO files have been submitted to translation coordination.
|
||||||
|
|
||||||
|
Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv
|
||||||
|
.----------------------------------------------------.
|
||||||
|
bash | [] [] [] | 3
|
||||||
|
bison | [] [] [] | 3
|
||||||
|
clisp | [] [] [] [] | 4
|
||||||
|
cpio | [] [] [] [] [] [] | 6
|
||||||
|
diffutils | [] [] [] [] [] | 5
|
||||||
|
enscript | [] [] [] [] [] [] | 6
|
||||||
|
fileutils | [] [] [] [] [] [] [] [] [] [] | 10
|
||||||
|
findutils | [] [] [] [] [] [] [] [] [] | 9
|
||||||
|
flex | [] [] [] [] | 4
|
||||||
|
gcal | [] [] [] [] [] | 5
|
||||||
|
gettext | [] [] [] [] [] [] [] [] [] [] [] | 12
|
||||||
|
grep | [] [] [] [] [] [] [] [] [] [] | 10
|
||||||
|
hello | [] [] [] [] [] [] [] [] [] [] [] | 11
|
||||||
|
id-utils | [] [] [] | 3
|
||||||
|
indent | [] [] [] [] [] | 5
|
||||||
|
libc | [] [] [] [] [] [] [] | 7
|
||||||
|
m4 | [] [] [] [] [] [] | 6
|
||||||
|
make | [] [] [] [] [] [] | 6
|
||||||
|
music | [] [] | 2
|
||||||
|
ptx | [] [] [] [] [] [] [] [] | 8
|
||||||
|
recode | [] [] [] [] [] [] [] [] [] | 9
|
||||||
|
sh-utils | [] [] [] [] [] [] [] [] | 8
|
||||||
|
sharutils | [] [] [] [] [] [] | 6
|
||||||
|
tar | [] [] [] [] [] [] [] [] [] [] [] | 11
|
||||||
|
texinfo | [] [] [] | 3
|
||||||
|
textutils | [] [] [] [] [] [] [] [] [] | 9
|
||||||
|
wdiff | [] [] [] [] [] [] [] [] | 8
|
||||||
|
`----------------------------------------------------'
|
||||||
|
17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv
|
||||||
|
27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179
|
||||||
|
|
||||||
|
Some counters in the preceding matrix are higher than the number of
|
||||||
|
visible blocks let us expect. This is because a few extra PO files are
|
||||||
|
used for implementing regional variants of languages, or language
|
||||||
|
dialects.
|
||||||
|
|
||||||
|
For a PO file in the matrix above to be effective, the package to
|
||||||
|
which it applies should also have been internationalized and
|
||||||
|
distributed as such by its maintainer. There might be an observable
|
||||||
|
lag between the mere existence a PO file and its wide availability in a
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
If December 1997 seems to be old, you may fetch a more recent copy
|
||||||
|
of this `ABOUT-NLS' file on most GNU archive sites.
|
||||||
|
|
||||||
6
Makefile.am
Normal file
6
Makefile.am
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = 1.0 foreign ansi2knr
|
||||||
|
|
||||||
|
SUBDIRS = intl po man lib libmisc src \
|
||||||
|
contrib debian doc etc old redhat
|
||||||
350
Makefile.in
Normal file
350
Makefile.in
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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.
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
DISTDIR =
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = .
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CATALOGS = @CATALOGS@
|
||||||
|
CATOBJEXT = @CATOBJEXT@
|
||||||
|
CC = @CC@
|
||||||
|
CPP = @CPP@
|
||||||
|
DATADIRNAME = @DATADIRNAME@
|
||||||
|
GENCAT = @GENCAT@
|
||||||
|
GMOFILES = @GMOFILES@
|
||||||
|
GMSGFMT = @GMSGFMT@
|
||||||
|
GT_NO = @GT_NO@
|
||||||
|
GT_YES = @GT_YES@
|
||||||
|
INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
|
||||||
|
INSTOBJEXT = @INSTOBJEXT@
|
||||||
|
INTLDEPS = @INTLDEPS@
|
||||||
|
INTLLIBS = @INTLLIBS@
|
||||||
|
INTLOBJS = @INTLOBJS@
|
||||||
|
LD = @LD@
|
||||||
|
LIBCRACK = @LIBCRACK@
|
||||||
|
LIBCRYPT = @LIBCRYPT@
|
||||||
|
LIBPAM = @LIBPAM@
|
||||||
|
LIBSKEY = @LIBSKEY@
|
||||||
|
LIBTCFS = @LIBTCFS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
|
MSGFMT = @MSGFMT@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
POFILES = @POFILES@
|
||||||
|
POSUB = @POSUB@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
U = @U@
|
||||||
|
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
||||||
|
USE_NLS = @USE_NLS@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
YACC = @YACC@
|
||||||
|
l = @l@
|
||||||
|
|
||||||
|
AUTOMAKE_OPTIONS = 1.0 foreign ansi2knr
|
||||||
|
|
||||||
|
SUBDIRS = intl po man lib libmisc src \
|
||||||
|
contrib debian doc etc old redhat
|
||||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
DIST_COMMON = ABOUT-NLS Makefile.am Makefile.in acconfig.h aclocal.m4 \
|
||||||
|
ansi2knr.1 ansi2knr.c config.guess config.h.in config.sub configure \
|
||||||
|
configure.in install-sh ltconfig ltmain.sh missing mkinstalldirs \
|
||||||
|
stamp-h.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
all: all-recursive-am all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
$(ACLOCAL_M4): configure.in
|
||||||
|
cd $(srcdir) && $(ACLOCAL)
|
||||||
|
|
||||||
|
config.status: $(srcdir)/configure
|
||||||
|
$(SHELL) ./config.status --recheck
|
||||||
|
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
|
||||||
|
cd $(srcdir) && $(AUTOCONF)
|
||||||
|
|
||||||
|
config.h: stamp-h
|
||||||
|
@:
|
||||||
|
stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES= CONFIG_HEADERS=config.h \
|
||||||
|
$(SHELL) ./config.status
|
||||||
|
@echo timestamp > stamp-h
|
||||||
|
$(srcdir)/config.h.in: $(srcdir)/stamp-h.in
|
||||||
|
$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
|
||||||
|
cd $(top_srcdir) && $(AUTOHEADER)
|
||||||
|
@echo timestamp > $(srcdir)/stamp-h.in
|
||||||
|
|
||||||
|
mostlyclean-hdr:
|
||||||
|
|
||||||
|
clean-hdr:
|
||||||
|
|
||||||
|
distclean-hdr:
|
||||||
|
-rm -f config.h
|
||||||
|
|
||||||
|
maintainer-clean-hdr:
|
||||||
|
|
||||||
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
|
# into them and run `make' without going through this Makefile.
|
||||||
|
# To change the values of `make' variables: instead of editing Makefiles,
|
||||||
|
# (1) if the variable is set in `config.status', edit `config.status'
|
||||||
|
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||||
|
# (2) otherwise, pass the desired values on the `make' command line.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
all-recursive install-data-recursive install-exec-recursive \
|
||||||
|
installdirs-recursive install-recursive uninstall-recursive \
|
||||||
|
check-recursive installcheck-recursive info-recursive dvi-recursive:
|
||||||
|
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
(cd $$subdir && $(MAKE) $$target) \
|
||||||
|
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
|
||||||
|
mostlyclean-recursive clean-recursive distclean-recursive \
|
||||||
|
maintainer-clean-recursive:
|
||||||
|
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||||
|
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
rev="$$subdir $$rev"; \
|
||||||
|
done; \
|
||||||
|
for subdir in $$rev; do \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
(cd $$subdir && $(MAKE) $$target) \
|
||||||
|
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
tags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
(cd $$subdir && $(MAKE) tags); \
|
||||||
|
done
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP)
|
||||||
|
here=`pwd` && cd $(srcdir) \
|
||||||
|
&& mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP)
|
||||||
|
|
||||||
|
TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
|
||||||
|
done; \
|
||||||
|
list='$(SOURCES) $(HEADERS)'; \
|
||||||
|
unique=`for i in $$list; do echo $$i; done | \
|
||||||
|
awk ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
|
||||||
|
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
|
||||||
|
|
||||||
|
mostlyclean-tags:
|
||||||
|
|
||||||
|
clean-tags:
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID
|
||||||
|
|
||||||
|
maintainer-clean-tags:
|
||||||
|
|
||||||
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
|
top_distdir = $(distdir)
|
||||||
|
|
||||||
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||||
|
# it guarantees that the distribution is self-contained by making another
|
||||||
|
# tarfile.
|
||||||
|
distcheck: dist
|
||||||
|
-rm -rf $(distdir)
|
||||||
|
GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz
|
||||||
|
mkdir $(distdir)/=build
|
||||||
|
mkdir $(distdir)/=inst
|
||||||
|
dc_install_base=`cd $(distdir)/=inst && pwd`; \
|
||||||
|
cd $(distdir)/=build \
|
||||||
|
&& ../configure --with-included-gettext --srcdir=.. --prefix=$$dc_install_base \
|
||||||
|
&& $(MAKE) \
|
||||||
|
&& $(MAKE) dvi \
|
||||||
|
&& $(MAKE) check \
|
||||||
|
&& $(MAKE) install \
|
||||||
|
&& $(MAKE) installcheck \
|
||||||
|
&& $(MAKE) dist
|
||||||
|
-rm -rf $(distdir)
|
||||||
|
@echo "========================"; \
|
||||||
|
echo "$(distdir).tar.gz is ready for distribution"; \
|
||||||
|
echo "========================"
|
||||||
|
dist: distdir
|
||||||
|
-chmod -R a+r $(distdir)
|
||||||
|
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
|
||||||
|
-rm -rf $(distdir)
|
||||||
|
dist-all: distdir
|
||||||
|
-chmod -R a+r $(distdir)
|
||||||
|
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
|
||||||
|
-rm -rf $(distdir)
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
-rm -rf $(distdir)
|
||||||
|
mkdir $(distdir)
|
||||||
|
-chmod 777 $(distdir)
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
for subdir in $(SUBDIRS); do \
|
||||||
|
test -d $(distdir)/$$subdir \
|
||||||
|
|| mkdir $(distdir)/$$subdir \
|
||||||
|
|| exit 1; \
|
||||||
|
chmod 777 $(distdir)/$$subdir; \
|
||||||
|
(cd $$subdir && $(MAKE) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
|
||||||
|
|| exit 1; \
|
||||||
|
done
|
||||||
|
info: info-recursive
|
||||||
|
dvi: dvi-recursive
|
||||||
|
check: all-am
|
||||||
|
$(MAKE) check-recursive
|
||||||
|
installcheck: installcheck-recursive
|
||||||
|
all-recursive-am: config.h
|
||||||
|
$(MAKE) all-recursive
|
||||||
|
|
||||||
|
all-am: Makefile config.h
|
||||||
|
|
||||||
|
install-exec: install-exec-recursive
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data: install-data-recursive
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-recursive
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall: uninstall-recursive
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs: installdirs-recursive
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic
|
||||||
|
|
||||||
|
clean-am: clean-hdr clean-tags clean-generic mostlyclean-am
|
||||||
|
|
||||||
|
distclean-am: distclean-hdr distclean-tags distclean-generic clean-am
|
||||||
|
|
||||||
|
maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \
|
||||||
|
maintainer-clean-generic distclean-am
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-recursive mostlyclean-am
|
||||||
|
|
||||||
|
clean: clean-recursive clean-am
|
||||||
|
|
||||||
|
distclean: distclean-recursive distclean-am
|
||||||
|
-rm -f config.status
|
||||||
|
-rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
-rm -f config.status
|
||||||
|
|
||||||
|
.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
|
||||||
|
install-data-recursive uninstall-data-recursive install-exec-recursive \
|
||||||
|
uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
|
||||||
|
all-recursive check-recursive installcheck-recursive info-recursive \
|
||||||
|
dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
|
||||||
|
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
|
||||||
|
distclean-tags clean-tags maintainer-clean-tags distdir info dvi \
|
||||||
|
installcheck all-recursive-am all-am install-exec install-data install \
|
||||||
|
uninstall all installdirs mostlyclean-generic distclean-generic \
|
||||||
|
clean-generic maintainer-clean-generic clean mostlyclean distclean \
|
||||||
|
maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
154
acconfig.h
Normal file
154
acconfig.h
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
/* $Id: acconfig.h,v 1.12 1999/06/07 16:40:43 marekm Exp $ */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Define to enable password aging. */
|
||||||
|
#undef AGING
|
||||||
|
|
||||||
|
/* Define if struct passwd has pw_age. */
|
||||||
|
#undef ATT_AGE
|
||||||
|
|
||||||
|
/* Define if struct passwd has pw_comment. */
|
||||||
|
#undef ATT_COMMENT
|
||||||
|
|
||||||
|
/* Define to support JFH's auth. methods. UNTESTED. */
|
||||||
|
#undef AUTH_METHODS
|
||||||
|
|
||||||
|
/* Define if struct passwd has pw_quota. */
|
||||||
|
#undef BSD_QUOTA
|
||||||
|
|
||||||
|
/* Define if you have secure RPC. */
|
||||||
|
#undef DES_RPC
|
||||||
|
|
||||||
|
/* Define to support 16-character passwords. */
|
||||||
|
#undef DOUBLESIZE
|
||||||
|
|
||||||
|
/* Define to 1 if NLS is requested. */
|
||||||
|
#undef ENABLE_NLS
|
||||||
|
|
||||||
|
/* Path for faillog file. */
|
||||||
|
#undef FAILLOG_FILE
|
||||||
|
|
||||||
|
/* Define if you want my getgrent routines. */
|
||||||
|
#undef GETGRENT
|
||||||
|
|
||||||
|
/* Define to libshadow_getpass to use our own version of getpass(). */
|
||||||
|
#undef getpass
|
||||||
|
|
||||||
|
/* Define if you want my getpwent routines. */
|
||||||
|
#undef GETPWENT
|
||||||
|
|
||||||
|
/* Define as 1 if you have catgets and don't want to use GNU gettext. */
|
||||||
|
#undef HAVE_CATGETS
|
||||||
|
|
||||||
|
/* Define as 1 if you have gettext and don't want to use GNU gettext. */
|
||||||
|
#undef HAVE_GETTEXT
|
||||||
|
|
||||||
|
/* Define if your locale.h file contains LC_MESSAGES. */
|
||||||
|
#undef HAVE_LC_MESSAGES
|
||||||
|
|
||||||
|
/* Defined if you have libcrack. */
|
||||||
|
#undef HAVE_LIBCRACK
|
||||||
|
|
||||||
|
/* Defined if you have the ts&szs cracklib. */
|
||||||
|
#undef HAVE_LIBCRACK_HIST
|
||||||
|
|
||||||
|
/* Defined if it includes *Pw functions. */
|
||||||
|
#undef HAVE_LIBCRACK_PW
|
||||||
|
|
||||||
|
/* Defined if you have libcrypt. */
|
||||||
|
#undef HAVE_LIBCRYPT
|
||||||
|
|
||||||
|
/* Define if struct lastlog has ll_host */
|
||||||
|
#undef HAVE_LL_HOST
|
||||||
|
|
||||||
|
/* Working shadow group support in libc? */
|
||||||
|
#undef HAVE_SHADOWGRP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the stpcpy function. */
|
||||||
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
|
/* Define to support TCFS. */
|
||||||
|
#undef HAVE_TCFS
|
||||||
|
|
||||||
|
/* Path for lastlog file. */
|
||||||
|
#undef LASTLOG_FILE
|
||||||
|
|
||||||
|
/* Define to support /etc/login.access login access control. */
|
||||||
|
#undef LOGIN_ACCESS
|
||||||
|
|
||||||
|
/* Location of system mail spool directory. */
|
||||||
|
#undef MAIL_SPOOL_DIR
|
||||||
|
|
||||||
|
/* Name of user's mail spool file if stored in user's home directory. */
|
||||||
|
#undef MAIL_SPOOL_FILE
|
||||||
|
|
||||||
|
/* Define to support the MD5-based password hashing algorithm. */
|
||||||
|
#undef MD5_CRYPT
|
||||||
|
|
||||||
|
/* Define to use ndbm. */
|
||||||
|
#undef NDBM
|
||||||
|
|
||||||
|
/* Define to enable the new readpass() that echoes asterisks. */
|
||||||
|
#undef NEW_READPASS
|
||||||
|
|
||||||
|
/* Define to support OPIE one-time password logins. */
|
||||||
|
#undef OPIE
|
||||||
|
|
||||||
|
/* Package name. */
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* Define if pam_strerror() needs two arguments (Linux-PAM 0.59). */
|
||||||
|
#undef PAM_STRERROR_NEEDS_TWO_ARGS
|
||||||
|
|
||||||
|
/* Path to passwd program. */
|
||||||
|
#undef PASSWD_PROGRAM
|
||||||
|
|
||||||
|
/* Define if the compiler understands function prototypes. */
|
||||||
|
#undef PROTOTYPES
|
||||||
|
|
||||||
|
/* Define if login should support the -r flag for rlogind. */
|
||||||
|
#undef RLOGIN
|
||||||
|
|
||||||
|
/* Define to the ruserok() "success" return value (0 or 1). */
|
||||||
|
#undef RUSEROK
|
||||||
|
|
||||||
|
/* Define to support the shadow group file. */
|
||||||
|
#undef SHADOWGRP
|
||||||
|
|
||||||
|
/* Define to support the shadow password file. */
|
||||||
|
#undef SHADOWPWD
|
||||||
|
|
||||||
|
/* Define to support S/Key logins. */
|
||||||
|
#undef SKEY
|
||||||
|
|
||||||
|
/* Define to support /etc/suauth su access control. */
|
||||||
|
#undef SU_ACCESS
|
||||||
|
|
||||||
|
/* Define to support SecureWare(tm) long passwords. */
|
||||||
|
#undef SW_CRYPT
|
||||||
|
|
||||||
|
/* Define if you want gdbm for TCFS. */
|
||||||
|
#undef TCFS_GDBM_SUPPORT
|
||||||
|
|
||||||
|
/* Define to support Pluggable Authentication Modules. */
|
||||||
|
#undef USE_PAM
|
||||||
|
|
||||||
|
/* Define to use syslog(). */
|
||||||
|
#undef USE_SYSLOG
|
||||||
|
|
||||||
|
/* Define if you have ut_host in struct utmp. */
|
||||||
|
#undef UT_HOST
|
||||||
|
|
||||||
|
/* Path for utmp file. */
|
||||||
|
#undef _UTMP_FILE
|
||||||
|
|
||||||
|
/* Define to ut_name if struct utmp has ut_name (not ut_user). */
|
||||||
|
#undef ut_user
|
||||||
|
|
||||||
|
/* Version. */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
|
/* Path for wtmp file. */
|
||||||
|
#undef _WTMP_FILE
|
||||||
|
|
||||||
868
aclocal.m4
vendored
Normal file
868
aclocal.m4
vendored
Normal file
@@ -0,0 +1,868 @@
|
|||||||
|
dnl aclocal.m4 generated automatically by aclocal 1.3
|
||||||
|
|
||||||
|
dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
dnl This Makefile.in is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl This program is distributed in the hope that it will be useful,
|
||||||
|
dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
dnl PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
# Do all the work for Automake. This macro actually does too much --
|
||||||
|
# some checks are only needed if your package does certain things.
|
||||||
|
# But this isn't really a big deal.
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
dnl Usage:
|
||||||
|
dnl AM_INIT_AUTOMAKE(package,version, [no-define])
|
||||||
|
|
||||||
|
AC_DEFUN(AM_INIT_AUTOMAKE,
|
||||||
|
[AC_REQUIRE([AM_PROG_INSTALL])
|
||||||
|
PACKAGE=[$1]
|
||||||
|
AC_SUBST(PACKAGE)
|
||||||
|
VERSION=[$2]
|
||||||
|
AC_SUBST(VERSION)
|
||||||
|
dnl test to see if srcdir already configured
|
||||||
|
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
|
||||||
|
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
|
||||||
|
fi
|
||||||
|
ifelse([$3],,
|
||||||
|
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
|
||||||
|
AC_DEFINE_UNQUOTED(VERSION, "$VERSION"))
|
||||||
|
AC_REQUIRE([AM_SANITY_CHECK])
|
||||||
|
AC_REQUIRE([AC_ARG_PROGRAM])
|
||||||
|
dnl FIXME This is truly gross.
|
||||||
|
missing_dir=`cd $ac_aux_dir && pwd`
|
||||||
|
AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
|
||||||
|
AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
|
||||||
|
AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
|
||||||
|
AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
|
||||||
|
AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
|
||||||
|
AC_REQUIRE([AC_PROG_MAKE_SET])])
|
||||||
|
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
AC_DEFUN(AM_PROG_INSTALL,
|
||||||
|
[AC_REQUIRE([AC_PROG_INSTALL])
|
||||||
|
test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
|
||||||
|
AC_SUBST(INSTALL_SCRIPT)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
#
|
||||||
|
# Check to make sure that the build environment is sane.
|
||||||
|
#
|
||||||
|
|
||||||
|
AC_DEFUN(AM_SANITY_CHECK,
|
||||||
|
[AC_MSG_CHECKING([whether build environment is sane])
|
||||||
|
# Just in case
|
||||||
|
sleep 1
|
||||||
|
echo timestamp > conftestfile
|
||||||
|
# Do `set' in a subshell so we don't clobber the current shell's
|
||||||
|
# arguments. Must try -L first in case configure is actually a
|
||||||
|
# symlink; some systems play weird games with the mod time of symlinks
|
||||||
|
# (eg FreeBSD returns the mod time of the symlink's containing
|
||||||
|
# directory).
|
||||||
|
if (
|
||||||
|
set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
|
||||||
|
if test "[$]*" = "X"; then
|
||||||
|
# -L didn't work.
|
||||||
|
set X `ls -t $srcdir/configure conftestfile`
|
||||||
|
fi
|
||||||
|
if test "[$]*" != "X $srcdir/configure conftestfile" \
|
||||||
|
&& test "[$]*" != "X conftestfile $srcdir/configure"; then
|
||||||
|
|
||||||
|
# If neither matched, then we have a broken ls. This can happen
|
||||||
|
# if, for instance, CONFIG_SHELL is bash and it inherits a
|
||||||
|
# broken ls alias from the environment. This has actually
|
||||||
|
# happened. Such a system could not be considered "sane".
|
||||||
|
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
|
||||||
|
alias in your environment])
|
||||||
|
fi
|
||||||
|
|
||||||
|
test "[$]2" = conftestfile
|
||||||
|
)
|
||||||
|
then
|
||||||
|
# Ok.
|
||||||
|
:
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([newly created file is older than distributed files!
|
||||||
|
Check your system clock])
|
||||||
|
fi
|
||||||
|
rm -f conftest*
|
||||||
|
AC_MSG_RESULT(yes)])
|
||||||
|
|
||||||
|
dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
|
||||||
|
dnl The program must properly implement --version.
|
||||||
|
AC_DEFUN(AM_MISSING_PROG,
|
||||||
|
[AC_MSG_CHECKING(for working $2)
|
||||||
|
# Run test in a subshell; some versions of sh will print an error if
|
||||||
|
# an executable is not found, even if stderr is redirected.
|
||||||
|
# Redirect stdin to placate older versions of autoconf. Sigh.
|
||||||
|
if ($2 --version) < /dev/null > /dev/null 2>&1; then
|
||||||
|
$1=$2
|
||||||
|
AC_MSG_RESULT(found)
|
||||||
|
else
|
||||||
|
$1="$3/missing $2"
|
||||||
|
AC_MSG_RESULT(missing)
|
||||||
|
fi
|
||||||
|
AC_SUBST($1)])
|
||||||
|
|
||||||
|
# Like AC_CONFIG_HEADER, but automatically create stamp file.
|
||||||
|
|
||||||
|
AC_DEFUN(AM_CONFIG_HEADER,
|
||||||
|
[AC_PREREQ([2.12])
|
||||||
|
AC_CONFIG_HEADER([$1])
|
||||||
|
dnl When config.status generates a header, we must update the stamp-h file.
|
||||||
|
dnl This file resides in the same directory as the config header
|
||||||
|
dnl that is generated. We must strip everything past the first ":",
|
||||||
|
dnl and everything past the last "/".
|
||||||
|
AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
|
||||||
|
ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
|
||||||
|
<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
|
||||||
|
<<am_indx=1
|
||||||
|
for am_file in <<$1>>; do
|
||||||
|
case " <<$>>CONFIG_HEADERS " in
|
||||||
|
*" <<$>>am_file "*<<)>>
|
||||||
|
echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
am_indx=`expr "<<$>>am_indx" + 1`
|
||||||
|
done<<>>dnl>>)
|
||||||
|
changequote([,]))])
|
||||||
|
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
AC_DEFUN(AM_C_PROTOTYPES,
|
||||||
|
[AC_REQUIRE([AM_PROG_CC_STDC])
|
||||||
|
AC_REQUIRE([AC_PROG_CPP])
|
||||||
|
AC_MSG_CHECKING([for function prototypes])
|
||||||
|
if test "$am_cv_prog_cc_stdc" != no; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(PROTOTYPES)
|
||||||
|
U= ANSI2KNR=
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
U=_ ANSI2KNR=./ansi2knr
|
||||||
|
# Ensure some checks needed by ansi2knr itself.
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(string.h)
|
||||||
|
fi
|
||||||
|
AC_SUBST(U)dnl
|
||||||
|
AC_SUBST(ANSI2KNR)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
# @defmac AC_PROG_CC_STDC
|
||||||
|
# @maindex PROG_CC_STDC
|
||||||
|
# @ovindex CC
|
||||||
|
# If the C compiler in not in ANSI C mode by default, try to add an option
|
||||||
|
# to output variable @code{CC} to make it so. This macro tries various
|
||||||
|
# options that select ANSI C on some system or another. It considers the
|
||||||
|
# compiler to be in ANSI C mode if it handles function prototypes correctly.
|
||||||
|
#
|
||||||
|
# If you use this macro, you should check after calling it whether the C
|
||||||
|
# compiler has been set to accept ANSI C; if not, the shell variable
|
||||||
|
# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source
|
||||||
|
# code in ANSI C, you can make an un-ANSIfied copy of it by using the
|
||||||
|
# program @code{ansi2knr}, which comes with Ghostscript.
|
||||||
|
# @end defmac
|
||||||
|
|
||||||
|
AC_DEFUN(AM_PROG_CC_STDC,
|
||||||
|
[AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_BEFORE([$0], [AC_C_INLINE])
|
||||||
|
AC_BEFORE([$0], [AC_C_CONST])
|
||||||
|
dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require
|
||||||
|
dnl a magic option to avoid problems with ANSI preprocessor commands
|
||||||
|
dnl like #elif.
|
||||||
|
dnl FIXME: can't do this because then AC_AIX won't work due to a
|
||||||
|
dnl circular dependency.
|
||||||
|
dnl AC_BEFORE([$0], [AC_PROG_CPP])
|
||||||
|
AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
|
||||||
|
AC_CACHE_VAL(am_cv_prog_cc_stdc,
|
||||||
|
[am_cv_prog_cc_stdc=no
|
||||||
|
ac_save_CC="$CC"
|
||||||
|
# Don't try gcc -ansi; that turns off useful extensions and
|
||||||
|
# breaks some systems' header files.
|
||||||
|
# AIX -qlanglvl=ansi
|
||||||
|
# Ultrix and OSF/1 -std1
|
||||||
|
# HP-UX -Aa -D_HPUX_SOURCE
|
||||||
|
# SVR4 -Xc -D__EXTENSIONS__
|
||||||
|
for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
|
||||||
|
do
|
||||||
|
CC="$ac_save_CC $ac_arg"
|
||||||
|
AC_TRY_COMPILE(
|
||||||
|
[#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
|
||||||
|
struct buf { int x; };
|
||||||
|
FILE * (*rcsopen) (struct buf *, struct stat *, int);
|
||||||
|
static char *e (p, i)
|
||||||
|
char **p;
|
||||||
|
int i;
|
||||||
|
{
|
||||||
|
return p[i];
|
||||||
|
}
|
||||||
|
static char *f (char * (*g) (char **, int), char **p, ...)
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
va_list v;
|
||||||
|
va_start (v,p);
|
||||||
|
s = g (p, va_arg (v,int));
|
||||||
|
va_end (v);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
int test (int i, double x);
|
||||||
|
struct s1 {int (*f) (int a);};
|
||||||
|
struct s2 {int (*f) (double a);};
|
||||||
|
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
], [
|
||||||
|
return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
|
||||||
|
],
|
||||||
|
[am_cv_prog_cc_stdc="$ac_arg"; break])
|
||||||
|
done
|
||||||
|
CC="$ac_save_CC"
|
||||||
|
])
|
||||||
|
if test -z "$am_cv_prog_cc_stdc"; then
|
||||||
|
AC_MSG_RESULT([none needed])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT($am_cv_prog_cc_stdc)
|
||||||
|
fi
|
||||||
|
case "x$am_cv_prog_cc_stdc" in
|
||||||
|
x|xno) ;;
|
||||||
|
*) CC="$CC $am_cv_prog_cc_stdc" ;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# serial 24 AM_PROG_LIBTOOL
|
||||||
|
AC_DEFUN(AM_PROG_LIBTOOL,
|
||||||
|
[AC_REQUIRE([AM_ENABLE_SHARED])dnl
|
||||||
|
AC_REQUIRE([AM_ENABLE_STATIC])dnl
|
||||||
|
AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_RANLIB])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_CC])dnl
|
||||||
|
AC_REQUIRE([AM_PROG_LD])dnl
|
||||||
|
AC_REQUIRE([AM_PROG_NM])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_LN_S])dnl
|
||||||
|
dnl
|
||||||
|
# Always use our own libtool.
|
||||||
|
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
|
||||||
|
AC_SUBST(LIBTOOL)dnl
|
||||||
|
|
||||||
|
# Check for any special flags to pass to ltconfig.
|
||||||
|
libtool_flags=
|
||||||
|
test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
|
||||||
|
test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
|
||||||
|
test "$silent" = yes && libtool_flags="$libtool_flags --silent"
|
||||||
|
test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
|
||||||
|
test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
|
||||||
|
|
||||||
|
# Some flags need to be propagated to the compiler or linker for good
|
||||||
|
# libtool support.
|
||||||
|
case "$host" in
|
||||||
|
*-*-irix6*)
|
||||||
|
# Find out which ABI we are using.
|
||||||
|
echo '[#]line __oline__ "configure"' > conftest.$ac_ext
|
||||||
|
if AC_TRY_EVAL(ac_compile); then
|
||||||
|
case "`/usr/bin/file conftest.o`" in
|
||||||
|
*32-bit*)
|
||||||
|
LD="${LD-ld} -32"
|
||||||
|
;;
|
||||||
|
*N32*)
|
||||||
|
LD="${LD-ld} -n32"
|
||||||
|
;;
|
||||||
|
*64-bit*)
|
||||||
|
LD="${LD-ld} -64"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
rm -rf conftest*
|
||||||
|
;;
|
||||||
|
|
||||||
|
*-*-sco3.2v5*)
|
||||||
|
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
|
||||||
|
CFLAGS="$CFLAGS -belf"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Actually configure libtool. ac_aux_dir is where install-sh is found.
|
||||||
|
CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
|
||||||
|
LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
|
||||||
|
${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig \
|
||||||
|
$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
|
||||||
|
|| AC_MSG_ERROR([libtool configure failed])
|
||||||
|
])
|
||||||
|
|
||||||
|
# AM_ENABLE_SHARED - implement the --enable-shared flag
|
||||||
|
# Usage: AM_ENABLE_SHARED[(DEFAULT)]
|
||||||
|
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||||
|
# `yes'.
|
||||||
|
AC_DEFUN(AM_ENABLE_SHARED,
|
||||||
|
[define([AM_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||||
|
AC_ARG_ENABLE(shared,
|
||||||
|
changequote(<<, >>)dnl
|
||||||
|
<< --enable-shared build shared libraries [default=>>AM_ENABLE_SHARED_DEFAULT]
|
||||||
|
changequote([, ])dnl
|
||||||
|
[ --enable-shared=PKGS only build shared libraries if the current package
|
||||||
|
appears as an element in the PKGS list],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case "$enableval" in
|
||||||
|
yes) enable_shared=yes ;;
|
||||||
|
no) enable_shared=no ;;
|
||||||
|
*)
|
||||||
|
enable_shared=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_shared=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
enable_shared=AM_ENABLE_SHARED_DEFAULT)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
# AM_DISABLE_SHARED - set the default shared flag to --disable-shared
|
||||||
|
AC_DEFUN(AM_DISABLE_SHARED,
|
||||||
|
[AM_ENABLE_SHARED(no)])
|
||||||
|
|
||||||
|
# AM_DISABLE_STATIC - set the default static flag to --disable-static
|
||||||
|
AC_DEFUN(AM_DISABLE_STATIC,
|
||||||
|
[AM_ENABLE_STATIC(no)])
|
||||||
|
|
||||||
|
# AM_ENABLE_STATIC - implement the --enable-static flag
|
||||||
|
# Usage: AM_ENABLE_STATIC[(DEFAULT)]
|
||||||
|
# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
|
||||||
|
# `yes'.
|
||||||
|
AC_DEFUN(AM_ENABLE_STATIC,
|
||||||
|
[define([AM_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
|
||||||
|
AC_ARG_ENABLE(static,
|
||||||
|
changequote(<<, >>)dnl
|
||||||
|
<< --enable-static build static libraries [default=>>AM_ENABLE_STATIC_DEFAULT]
|
||||||
|
changequote([, ])dnl
|
||||||
|
[ --enable-static=PKGS only build shared libraries if the current package
|
||||||
|
appears as an element in the PKGS list],
|
||||||
|
[p=${PACKAGE-default}
|
||||||
|
case "$enableval" in
|
||||||
|
yes) enable_static=yes ;;
|
||||||
|
no) enable_static=no ;;
|
||||||
|
*)
|
||||||
|
enable_static=no
|
||||||
|
# Look at the argument we got. We use all the common list separators.
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
|
||||||
|
for pkg in $enableval; do
|
||||||
|
if test "X$pkg" = "X$p"; then
|
||||||
|
enable_static=yes
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
;;
|
||||||
|
esac],
|
||||||
|
enable_static=AM_ENABLE_STATIC_DEFAULT)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
# AM_PROG_LD - find the path to the GNU or non-GNU linker
|
||||||
|
AC_DEFUN(AM_PROG_LD,
|
||||||
|
[AC_ARG_WITH(gnu-ld,
|
||||||
|
[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
|
||||||
|
test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
ac_prog=ld
|
||||||
|
if test "$ac_cv_prog_gcc" = yes; then
|
||||||
|
# Check if gcc -print-prog-name=ld gives a path.
|
||||||
|
AC_MSG_CHECKING([for ld used by GCC])
|
||||||
|
ac_prog=`($CC -print-prog-name=ld) 2>&5`
|
||||||
|
case "$ac_prog" in
|
||||||
|
# Accept absolute paths.
|
||||||
|
/* | [A-Za-z]:\\*)
|
||||||
|
test -z "$LD" && LD="$ac_prog"
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
# If it fails, then pretend we aren't using GCC.
|
||||||
|
ac_prog=ld
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# If it is relative, then search for the first ld in PATH.
|
||||||
|
with_gnu_ld=unknown
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
elif test "$with_gnu_ld" = yes; then
|
||||||
|
AC_MSG_CHECKING([for GNU ld])
|
||||||
|
else
|
||||||
|
AC_MSG_CHECKING([for non-GNU ld])
|
||||||
|
fi
|
||||||
|
AC_CACHE_VAL(ac_cv_path_LD,
|
||||||
|
[if test -z "$LD"; then
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||||
|
for ac_dir in $PATH; do
|
||||||
|
test -z "$ac_dir" && ac_dir=.
|
||||||
|
if test -f "$ac_dir/$ac_prog"; then
|
||||||
|
ac_cv_path_LD="$ac_dir/$ac_prog"
|
||||||
|
# Check to see if the program is GNU ld. I'd rather use --version,
|
||||||
|
# but apparently some GNU ld's only accept -v.
|
||||||
|
# Break only if it was the GNU/non-GNU ld that we prefer.
|
||||||
|
if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
|
||||||
|
test "$with_gnu_ld" != no && break
|
||||||
|
else
|
||||||
|
test "$with_gnu_ld" != yes && break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
else
|
||||||
|
ac_cv_path_LD="$LD" # Let the user override the test with a path.
|
||||||
|
fi])
|
||||||
|
LD="$ac_cv_path_LD"
|
||||||
|
if test -n "$LD"; then
|
||||||
|
AC_MSG_RESULT($LD)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
|
||||||
|
AC_SUBST(LD)
|
||||||
|
AM_PROG_LD_GNU
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN(AM_PROG_LD_GNU,
|
||||||
|
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
|
||||||
|
[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
|
||||||
|
if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
|
||||||
|
ac_cv_prog_gnu_ld=yes
|
||||||
|
else
|
||||||
|
ac_cv_prog_gnu_ld=no
|
||||||
|
fi])
|
||||||
|
])
|
||||||
|
|
||||||
|
# AM_PROG_NM - find the path to a BSD-compatible name lister
|
||||||
|
AC_DEFUN(AM_PROG_NM,
|
||||||
|
[AC_MSG_CHECKING([for BSD-compatible nm])
|
||||||
|
AC_CACHE_VAL(ac_cv_path_NM,
|
||||||
|
[case "$NM" in
|
||||||
|
/* | [A-Za-z]:\\*)
|
||||||
|
ac_cv_path_NM="$NM" # Let the user override the test with a path.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||||
|
for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
|
||||||
|
test -z "$ac_dir" && ac_dir=.
|
||||||
|
if test -f $ac_dir/nm; then
|
||||||
|
# Check to see if the nm accepts a BSD-compat flag.
|
||||||
|
# Adding the `sed 1q' prevents false positives on HP-UX, which says:
|
||||||
|
# nm: unknown option "B" ignored
|
||||||
|
if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
|
||||||
|
ac_cv_path_NM="$ac_dir/nm -B"
|
||||||
|
elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
|
||||||
|
ac_cv_path_NM="$ac_dir/nm -p"
|
||||||
|
else
|
||||||
|
ac_cv_path_NM="$ac_dir/nm"
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
|
||||||
|
;;
|
||||||
|
esac])
|
||||||
|
NM="$ac_cv_path_NM"
|
||||||
|
AC_MSG_RESULT([$NM])
|
||||||
|
AC_SUBST(NM)
|
||||||
|
])
|
||||||
|
|
||||||
|
# Macro to add for using GNU gettext.
|
||||||
|
# Ulrich Drepper <drepper@cygnus.com>, 1995.
|
||||||
|
#
|
||||||
|
# This file can be copied and used freely without restrictions. It can
|
||||||
|
# be used in projects which are not available under the GNU Public License
|
||||||
|
# but which still want to provide support for the GNU gettext functionality.
|
||||||
|
# Please note that the actual code is *not* freely available.
|
||||||
|
|
||||||
|
# serial 5
|
||||||
|
|
||||||
|
AC_DEFUN(AM_WITH_NLS,
|
||||||
|
[AC_MSG_CHECKING([whether NLS is requested])
|
||||||
|
dnl Default is enabled NLS
|
||||||
|
AC_ARG_ENABLE(nls,
|
||||||
|
[ --disable-nls do not use Native Language Support],
|
||||||
|
USE_NLS=$enableval, USE_NLS=yes)
|
||||||
|
AC_MSG_RESULT($USE_NLS)
|
||||||
|
AC_SUBST(USE_NLS)
|
||||||
|
|
||||||
|
USE_INCLUDED_LIBINTL=no
|
||||||
|
|
||||||
|
dnl If we use NLS figure out what method
|
||||||
|
if test "$USE_NLS" = "yes"; then
|
||||||
|
AC_DEFINE(ENABLE_NLS)
|
||||||
|
AC_MSG_CHECKING([whether included gettext is requested])
|
||||||
|
AC_ARG_WITH(included-gettext,
|
||||||
|
[ --with-included-gettext use the GNU gettext library included here],
|
||||||
|
nls_cv_force_use_gnu_gettext=$withval,
|
||||||
|
nls_cv_force_use_gnu_gettext=no)
|
||||||
|
AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
|
||||||
|
|
||||||
|
nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
|
||||||
|
if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
|
||||||
|
dnl User does not insist on using GNU NLS library. Figure out what
|
||||||
|
dnl to use. If gettext or catgets are available (in this order) we
|
||||||
|
dnl use this. Else we have to fall back to GNU NLS library.
|
||||||
|
dnl catgets is only used if permitted by option --with-catgets.
|
||||||
|
nls_cv_header_intl=
|
||||||
|
nls_cv_header_libgt=
|
||||||
|
CATOBJEXT=NONE
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(libintl.h,
|
||||||
|
[AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc,
|
||||||
|
[AC_TRY_LINK([#include <libintl.h>], [return (int) gettext ("")],
|
||||||
|
gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)])
|
||||||
|
|
||||||
|
if test "$gt_cv_func_gettext_libc" != "yes"; then
|
||||||
|
AC_CHECK_LIB(intl, bindtextdomain,
|
||||||
|
[AC_CACHE_CHECK([for gettext in libintl],
|
||||||
|
gt_cv_func_gettext_libintl,
|
||||||
|
[AC_CHECK_LIB(intl, gettext,
|
||||||
|
gt_cv_func_gettext_libintl=yes,
|
||||||
|
gt_cv_func_gettext_libintl=no)],
|
||||||
|
gt_cv_func_gettext_libintl=no)])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$gt_cv_func_gettext_libc" = "yes" \
|
||||||
|
|| test "$gt_cv_func_gettext_libintl" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_GETTEXT)
|
||||||
|
AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
|
||||||
|
if test "$MSGFMT" != "no"; then
|
||||||
|
AC_CHECK_FUNCS(dcgettext)
|
||||||
|
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
|
||||||
|
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
|
||||||
|
AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
|
||||||
|
return _nl_msg_cat_cntr],
|
||||||
|
[CATOBJEXT=.gmo
|
||||||
|
DATADIRNAME=share],
|
||||||
|
[CATOBJEXT=.mo
|
||||||
|
DATADIRNAME=lib])
|
||||||
|
INSTOBJEXT=.mo
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
if test "$CATOBJEXT" = "NONE"; then
|
||||||
|
AC_MSG_CHECKING([whether catgets can be used])
|
||||||
|
AC_ARG_WITH(catgets,
|
||||||
|
[ --with-catgets use catgets functions if available],
|
||||||
|
nls_cv_use_catgets=$withval, nls_cv_use_catgets=no)
|
||||||
|
AC_MSG_RESULT($nls_cv_use_catgets)
|
||||||
|
|
||||||
|
if test "$nls_cv_use_catgets" = "yes"; then
|
||||||
|
dnl No gettext in C library. Try catgets next.
|
||||||
|
AC_CHECK_LIB(i, main)
|
||||||
|
AC_CHECK_FUNC(catgets,
|
||||||
|
[AC_DEFINE(HAVE_CATGETS)
|
||||||
|
INTLOBJS="\$(CATOBJS)"
|
||||||
|
AC_PATH_PROG(GENCAT, gencat, no)dnl
|
||||||
|
if test "$GENCAT" != "no"; then
|
||||||
|
AC_PATH_PROG(GMSGFMT, gmsgfmt, no)
|
||||||
|
if test "$GMSGFMT" = "no"; then
|
||||||
|
AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)
|
||||||
|
fi
|
||||||
|
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
|
||||||
|
USE_INCLUDED_LIBINTL=yes
|
||||||
|
CATOBJEXT=.cat
|
||||||
|
INSTOBJEXT=.cat
|
||||||
|
DATADIRNAME=lib
|
||||||
|
INTLDEPS='$(top_builddir)/intl/libintl.a'
|
||||||
|
INTLLIBS=$INTLDEPS
|
||||||
|
LIBS=`echo $LIBS | sed -e 's/-lintl//'`
|
||||||
|
nls_cv_header_intl=intl/libintl.h
|
||||||
|
nls_cv_header_libgt=intl/libgettext.h
|
||||||
|
fi])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$CATOBJEXT" = "NONE"; then
|
||||||
|
dnl Neither gettext nor catgets in included in the C library.
|
||||||
|
dnl Fall back on GNU gettext library.
|
||||||
|
nls_cv_use_gnu_gettext=yes
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$nls_cv_use_gnu_gettext" = "yes"; then
|
||||||
|
dnl Mark actions used to generate GNU NLS library.
|
||||||
|
INTLOBJS="\$(GETTOBJS)"
|
||||||
|
AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt)
|
||||||
|
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
|
||||||
|
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
|
||||||
|
AC_SUBST(MSGFMT)
|
||||||
|
USE_INCLUDED_LIBINTL=yes
|
||||||
|
CATOBJEXT=.gmo
|
||||||
|
INSTOBJEXT=.mo
|
||||||
|
DATADIRNAME=share
|
||||||
|
INTLDEPS='$(top_builddir)/intl/libintl.a'
|
||||||
|
INTLLIBS=$INTLDEPS
|
||||||
|
LIBS=`echo $LIBS | sed -e 's/-lintl//'`
|
||||||
|
nls_cv_header_intl=intl/libintl.h
|
||||||
|
nls_cv_header_libgt=intl/libgettext.h
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Test whether we really found GNU xgettext.
|
||||||
|
if test "$XGETTEXT" != ":"; then
|
||||||
|
dnl If it is no GNU xgettext we define it as : so that the
|
||||||
|
dnl Makefiles still can work.
|
||||||
|
if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
|
||||||
|
: ;
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(
|
||||||
|
[found xgettext program is not GNU xgettext; ignore it])
|
||||||
|
XGETTEXT=":"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We need to process the po/ directory.
|
||||||
|
POSUB=po
|
||||||
|
else
|
||||||
|
DATADIRNAME=share
|
||||||
|
nls_cv_header_intl=intl/libintl.h
|
||||||
|
nls_cv_header_libgt=intl/libgettext.h
|
||||||
|
fi
|
||||||
|
AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
|
||||||
|
AC_OUTPUT_COMMANDS(
|
||||||
|
[case "$CONFIG_FILES" in *po/Makefile.in*)
|
||||||
|
sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
|
||||||
|
esac])
|
||||||
|
|
||||||
|
|
||||||
|
# If this is used in GNU gettext we have to set USE_NLS to `yes'
|
||||||
|
# because some of the sources are only built for this goal.
|
||||||
|
if test "$PACKAGE" = gettext; then
|
||||||
|
USE_NLS=yes
|
||||||
|
USE_INCLUDED_LIBINTL=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl These rules are solely for the distribution goal. While doing this
|
||||||
|
dnl we only have to keep exactly one list of the available catalogs
|
||||||
|
dnl in configure.in.
|
||||||
|
for lang in $ALL_LINGUAS; do
|
||||||
|
GMOFILES="$GMOFILES $lang.gmo"
|
||||||
|
POFILES="$POFILES $lang.po"
|
||||||
|
done
|
||||||
|
|
||||||
|
dnl Make all variables we use known to autoconf.
|
||||||
|
AC_SUBST(USE_INCLUDED_LIBINTL)
|
||||||
|
AC_SUBST(CATALOGS)
|
||||||
|
AC_SUBST(CATOBJEXT)
|
||||||
|
AC_SUBST(DATADIRNAME)
|
||||||
|
AC_SUBST(GMOFILES)
|
||||||
|
AC_SUBST(INSTOBJEXT)
|
||||||
|
AC_SUBST(INTLDEPS)
|
||||||
|
AC_SUBST(INTLLIBS)
|
||||||
|
AC_SUBST(INTLOBJS)
|
||||||
|
AC_SUBST(POFILES)
|
||||||
|
AC_SUBST(POSUB)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN(AM_GNU_GETTEXT,
|
||||||
|
[AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_CC])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_RANLIB])dnl
|
||||||
|
AC_REQUIRE([AC_ISC_POSIX])dnl
|
||||||
|
AC_REQUIRE([AC_HEADER_STDC])dnl
|
||||||
|
AC_REQUIRE([AC_C_CONST])dnl
|
||||||
|
AC_REQUIRE([AC_C_INLINE])dnl
|
||||||
|
AC_REQUIRE([AC_TYPE_OFF_T])dnl
|
||||||
|
AC_REQUIRE([AC_TYPE_SIZE_T])dnl
|
||||||
|
AC_REQUIRE([AC_FUNC_ALLOCA])dnl
|
||||||
|
AC_REQUIRE([AC_FUNC_MMAP])dnl
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \
|
||||||
|
unistd.h sys/param.h])
|
||||||
|
AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \
|
||||||
|
strdup __argz_count __argz_stringify __argz_next])
|
||||||
|
|
||||||
|
if test "${ac_cv_func_stpcpy+set}" != "set"; then
|
||||||
|
AC_CHECK_FUNCS(stpcpy)
|
||||||
|
fi
|
||||||
|
if test "${ac_cv_func_stpcpy}" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_STPCPY)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AM_LC_MESSAGES
|
||||||
|
AM_WITH_NLS
|
||||||
|
|
||||||
|
if test "x$CATOBJEXT" != "x"; then
|
||||||
|
if test "x$ALL_LINGUAS" = "x"; then
|
||||||
|
LINGUAS=
|
||||||
|
else
|
||||||
|
AC_MSG_CHECKING(for catalogs to be installed)
|
||||||
|
NEW_LINGUAS=
|
||||||
|
for lang in ${LINGUAS=$ALL_LINGUAS}; do
|
||||||
|
case "$ALL_LINGUAS" in
|
||||||
|
*$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
LINGUAS=$NEW_LINGUAS
|
||||||
|
AC_MSG_RESULT($LINGUAS)
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Construct list of names of catalog files to be constructed.
|
||||||
|
if test -n "$LINGUAS"; then
|
||||||
|
for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl The reference to <locale.h> in the installed <libintl.h> file
|
||||||
|
dnl must be resolved because we cannot expect the users of this
|
||||||
|
dnl to define HAVE_LOCALE_H.
|
||||||
|
if test $ac_cv_header_locale_h = yes; then
|
||||||
|
INCLUDE_LOCALE_H="#include <locale.h>"
|
||||||
|
else
|
||||||
|
INCLUDE_LOCALE_H="\
|
||||||
|
/* The system does not provide the header <locale.h>. Take care yourself. */"
|
||||||
|
fi
|
||||||
|
AC_SUBST(INCLUDE_LOCALE_H)
|
||||||
|
|
||||||
|
dnl Determine which catalog format we have (if any is needed)
|
||||||
|
dnl For now we know about two different formats:
|
||||||
|
dnl Linux libc-5 and the normal X/Open format
|
||||||
|
test -d intl || mkdir intl
|
||||||
|
if test "$CATOBJEXT" = ".cat"; then
|
||||||
|
AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen)
|
||||||
|
|
||||||
|
dnl Transform the SED scripts while copying because some dumb SEDs
|
||||||
|
dnl cannot handle comments.
|
||||||
|
sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed
|
||||||
|
fi
|
||||||
|
dnl po2tbl.sed is always needed.
|
||||||
|
sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
|
||||||
|
$srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed
|
||||||
|
|
||||||
|
dnl In the intl/Makefile.in we have a special dependency which makes
|
||||||
|
dnl only sense for gettext. We comment this out for non-gettext
|
||||||
|
dnl packages.
|
||||||
|
if test "$PACKAGE" = "gettext"; then
|
||||||
|
GT_NO="#NO#"
|
||||||
|
GT_YES=
|
||||||
|
else
|
||||||
|
GT_NO=
|
||||||
|
GT_YES="#YES#"
|
||||||
|
fi
|
||||||
|
AC_SUBST(GT_NO)
|
||||||
|
AC_SUBST(GT_YES)
|
||||||
|
|
||||||
|
dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
|
||||||
|
dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
|
||||||
|
dnl Try to locate is.
|
||||||
|
MKINSTALLDIRS=
|
||||||
|
if test -n "$ac_aux_dir"; then
|
||||||
|
MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
|
||||||
|
fi
|
||||||
|
if test -z "$MKINSTALLDIRS"; then
|
||||||
|
MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
|
||||||
|
fi
|
||||||
|
AC_SUBST(MKINSTALLDIRS)
|
||||||
|
|
||||||
|
dnl *** For now the libtool support in intl/Makefile is not for real.
|
||||||
|
l=
|
||||||
|
AC_SUBST(l)
|
||||||
|
|
||||||
|
dnl Generate list of files to be processed by xgettext which will
|
||||||
|
dnl be included in po/Makefile.
|
||||||
|
test -d po || mkdir po
|
||||||
|
if test "x$srcdir" != "x."; then
|
||||||
|
if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
|
||||||
|
posrcprefix="$srcdir/"
|
||||||
|
else
|
||||||
|
posrcprefix="../$srcdir/"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
posrcprefix="../"
|
||||||
|
fi
|
||||||
|
rm -f po/POTFILES
|
||||||
|
sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
|
||||||
|
< $srcdir/po/POTFILES.in > po/POTFILES
|
||||||
|
])
|
||||||
|
|
||||||
|
# Search path for a program which passes the given test.
|
||||||
|
# Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
#
|
||||||
|
# This file can be copied and used freely without restrictions. It can
|
||||||
|
# be used in projects which are not available under the GNU Public License
|
||||||
|
# but which still want to provide support for the GNU gettext functionality.
|
||||||
|
# Please note that the actual code is *not* freely available.
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
|
||||||
|
dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
|
||||||
|
AC_DEFUN(AM_PATH_PROG_WITH_TEST,
|
||||||
|
[# Extract the first word of "$2", so it can be a program name with args.
|
||||||
|
set dummy $2; ac_word=[$]2
|
||||||
|
AC_MSG_CHECKING([for $ac_word])
|
||||||
|
AC_CACHE_VAL(ac_cv_path_$1,
|
||||||
|
[case "[$]$1" in
|
||||||
|
/*)
|
||||||
|
ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||||
|
for ac_dir in ifelse([$5], , $PATH, [$5]); do
|
||||||
|
test -z "$ac_dir" && ac_dir=.
|
||||||
|
if test -f $ac_dir/$ac_word; then
|
||||||
|
if [$3]; then
|
||||||
|
ac_cv_path_$1="$ac_dir/$ac_word"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
dnl If no 4th arg is given, leave the cache variable unset,
|
||||||
|
dnl so AC_PATH_PROGS will keep looking.
|
||||||
|
ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
|
||||||
|
])dnl
|
||||||
|
;;
|
||||||
|
esac])dnl
|
||||||
|
$1="$ac_cv_path_$1"
|
||||||
|
if test -n "[$]$1"; then
|
||||||
|
AC_MSG_RESULT([$]$1)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
AC_SUBST($1)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
# Check whether LC_MESSAGES is available in <locale.h>.
|
||||||
|
# Ulrich Drepper <drepper@cygnus.com>, 1995.
|
||||||
|
#
|
||||||
|
# This file can be copied and used freely without restrictions. It can
|
||||||
|
# be used in projects which are not available under the GNU Public License
|
||||||
|
# but which still want to provide support for the GNU gettext functionality.
|
||||||
|
# Please note that the actual code is *not* freely available.
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
AC_DEFUN(AM_LC_MESSAGES,
|
||||||
|
[if test $ac_cv_header_locale_h = yes; then
|
||||||
|
AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
|
||||||
|
[AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
|
||||||
|
am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
|
||||||
|
if test $am_cv_val_LC_MESSAGES = yes; then
|
||||||
|
AC_DEFINE(HAVE_LC_MESSAGES)
|
||||||
|
fi
|
||||||
|
fi])
|
||||||
|
|
||||||
36
ansi2knr.1
Normal file
36
ansi2knr.1
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
.TH ANSI2KNR 1 "19 Jan 1996"
|
||||||
|
.SH NAME
|
||||||
|
ansi2knr \- convert ANSI C to Kernighan & Ritchie C
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.I ansi2knr
|
||||||
|
[--varargs] input_file [output_file]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
If no output_file is supplied, output goes to stdout.
|
||||||
|
.br
|
||||||
|
There are no error messages.
|
||||||
|
.sp
|
||||||
|
.I ansi2knr
|
||||||
|
recognizes function definitions by seeing a non-keyword identifier at the left
|
||||||
|
margin, followed by a left parenthesis, with a right parenthesis as the last
|
||||||
|
character on the line, and with a left brace as the first token on the
|
||||||
|
following line (ignoring possible intervening comments). It will recognize a
|
||||||
|
multi-line header provided that no intervening line ends with a left or right
|
||||||
|
brace or a semicolon. These algorithms ignore whitespace and comments, except
|
||||||
|
that the function name must be the first thing on the line.
|
||||||
|
.sp
|
||||||
|
The following constructs will confuse it:
|
||||||
|
.br
|
||||||
|
- Any other construct that starts at the left margin and follows the
|
||||||
|
above syntax (such as a macro or function call).
|
||||||
|
.br
|
||||||
|
- Some macros that tinker with the syntax of the function header.
|
||||||
|
.sp
|
||||||
|
The --varargs switch is obsolete, and is recognized only for
|
||||||
|
backwards compatibility. The present version of
|
||||||
|
.I ansi2knr
|
||||||
|
will always attempt to convert a ... argument to va_alist and va_dcl.
|
||||||
|
.SH AUTHOR
|
||||||
|
L. Peter Deutsch <ghost@aladdin.com> wrote the original ansi2knr and
|
||||||
|
continues to maintain the current version; most of the code in the current
|
||||||
|
version is his work. ansi2knr also includes contributions by Francois
|
||||||
|
Pinard <pinard@iro.umontreal.ca> and Jim Avera <jima@netcom.com>.
|
||||||
574
ansi2knr.c
Normal file
574
ansi2knr.c
Normal file
@@ -0,0 +1,574 @@
|
|||||||
|
/* Copyright (C) 1989, 1997 Aladdin Enterprises. All rights reserved. */
|
||||||
|
|
||||||
|
/*$Id: ansi2knr.c,v 1.9 1998/04/03 21:56:52 tromey Exp $*/
|
||||||
|
/* Convert ANSI C function definitions to K&R ("traditional C") syntax */
|
||||||
|
|
||||||
|
/*
|
||||||
|
ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY. No author or distributor accepts responsibility to anyone for the
|
||||||
|
consequences of using it or for whether it serves any particular purpose or
|
||||||
|
works at all, unless he says so in writing. Refer to the GNU General Public
|
||||||
|
License (the "GPL") for full details.
|
||||||
|
|
||||||
|
Everyone is granted permission to copy, modify and redistribute ansi2knr,
|
||||||
|
but only under the conditions described in the GPL. A copy of this license
|
||||||
|
is supposed to have been given to you along with ansi2knr so you can know
|
||||||
|
your rights and responsibilities. It should be in a file named COPYLEFT,
|
||||||
|
or, if there is no file named COPYLEFT, a file named COPYING. Among other
|
||||||
|
things, the copyright notice and this notice must be preserved on all
|
||||||
|
copies.
|
||||||
|
|
||||||
|
We explicitly state here what we believe is already implied by the GPL: if
|
||||||
|
the ansi2knr program is distributed as a separate set of sources and a
|
||||||
|
separate executable file which are aggregated on a storage medium together
|
||||||
|
with another program, this in itself does not bring the other program under
|
||||||
|
the GPL, nor does the mere fact that such a program or the procedures for
|
||||||
|
constructing it invoke the ansi2knr executable bring any other part of the
|
||||||
|
program under the GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Usage:
|
||||||
|
ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]
|
||||||
|
* --filename provides the file name for the #line directive in the output,
|
||||||
|
* overriding input_file (if present).
|
||||||
|
* If no input_file is supplied, input is read from stdin.
|
||||||
|
* If no output_file is supplied, output goes to stdout.
|
||||||
|
* There are no error messages.
|
||||||
|
*
|
||||||
|
* ansi2knr recognizes function definitions by seeing a non-keyword
|
||||||
|
* identifier at the left margin, followed by a left parenthesis,
|
||||||
|
* with a right parenthesis as the last character on the line,
|
||||||
|
* and with a left brace as the first token on the following line
|
||||||
|
* (ignoring possible intervening comments).
|
||||||
|
* It will recognize a multi-line header provided that no intervening
|
||||||
|
* line ends with a left or right brace or a semicolon.
|
||||||
|
* These algorithms ignore whitespace and comments, except that
|
||||||
|
* the function name must be the first thing on the line.
|
||||||
|
* The following constructs will confuse it:
|
||||||
|
* - Any other construct that starts at the left margin and
|
||||||
|
* follows the above syntax (such as a macro or function call).
|
||||||
|
* - Some macros that tinker with the syntax of the function header.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The original and principal author of ansi2knr is L. Peter Deutsch
|
||||||
|
* <ghost@aladdin.com>. Other authors are noted in the change history
|
||||||
|
* that follows (in reverse chronological order):
|
||||||
|
lpd 97-12-08 made input_file optional; only closes input and/or
|
||||||
|
output file if not stdin or stdout respectively; prints
|
||||||
|
usage message on stderr rather than stdout; adds
|
||||||
|
--filename switch (changes suggested by
|
||||||
|
<ceder@lysator.liu.se>)
|
||||||
|
lpd 96-01-21 added code to cope with not HAVE_CONFIG_H and with
|
||||||
|
compilers that don't understand void, as suggested by
|
||||||
|
Tom Lane
|
||||||
|
lpd 96-01-15 changed to require that the first non-comment token
|
||||||
|
on the line following a function header be a left brace,
|
||||||
|
to reduce sensitivity to macros, as suggested by Tom Lane
|
||||||
|
<tgl@sss.pgh.pa.us>
|
||||||
|
lpd 95-06-22 removed #ifndefs whose sole purpose was to define
|
||||||
|
undefined preprocessor symbols as 0; changed all #ifdefs
|
||||||
|
for configuration symbols to #ifs
|
||||||
|
lpd 95-04-05 changed copyright notice to make it clear that
|
||||||
|
including ansi2knr in a program does not bring the entire
|
||||||
|
program under the GPL
|
||||||
|
lpd 94-12-18 added conditionals for systems where ctype macros
|
||||||
|
don't handle 8-bit characters properly, suggested by
|
||||||
|
Francois Pinard <pinard@iro.umontreal.ca>;
|
||||||
|
removed --varargs switch (this is now the default)
|
||||||
|
lpd 94-10-10 removed CONFIG_BROKETS conditional
|
||||||
|
lpd 94-07-16 added some conditionals to help GNU `configure',
|
||||||
|
suggested by Francois Pinard <pinard@iro.umontreal.ca>;
|
||||||
|
properly erase prototype args in function parameters,
|
||||||
|
contributed by Jim Avera <jima@netcom.com>;
|
||||||
|
correct error in writeblanks (it shouldn't erase EOLs)
|
||||||
|
lpd 89-xx-xx original version
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Most of the conditionals here are to make ansi2knr work with */
|
||||||
|
/* or without the GNU configure machinery. */
|
||||||
|
|
||||||
|
#if HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#if HAVE_CONFIG_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
|
||||||
|
This will define HAVE_CONFIG_H and so, activate the following lines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
# if STDC_HEADERS || HAVE_STRING_H
|
||||||
|
# include <string.h>
|
||||||
|
# else
|
||||||
|
# include <strings.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else /* not HAVE_CONFIG_H */
|
||||||
|
|
||||||
|
/* Otherwise do it the hard way */
|
||||||
|
|
||||||
|
# ifdef BSD
|
||||||
|
# include <strings.h>
|
||||||
|
# else
|
||||||
|
# ifdef VMS
|
||||||
|
extern int strlen(), strncmp();
|
||||||
|
# else
|
||||||
|
# include <string.h>
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif /* not HAVE_CONFIG_H */
|
||||||
|
|
||||||
|
#if STDC_HEADERS
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
malloc and free should be declared in stdlib.h,
|
||||||
|
but if you've got a K&R compiler, they probably aren't.
|
||||||
|
*/
|
||||||
|
# ifdef MSDOS
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
# ifdef VMS
|
||||||
|
extern char *malloc();
|
||||||
|
extern void free();
|
||||||
|
# else
|
||||||
|
extern char *malloc();
|
||||||
|
extern int free();
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The ctype macros don't always handle 8-bit characters correctly.
|
||||||
|
* Compensate for this here.
|
||||||
|
*/
|
||||||
|
#ifdef isascii
|
||||||
|
# undef HAVE_ISASCII /* just in case */
|
||||||
|
# define HAVE_ISASCII 1
|
||||||
|
#else
|
||||||
|
#endif
|
||||||
|
#if STDC_HEADERS || !HAVE_ISASCII
|
||||||
|
# define is_ascii(c) 1
|
||||||
|
#else
|
||||||
|
# define is_ascii(c) isascii(c)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define is_space(c) (is_ascii(c) && isspace(c))
|
||||||
|
#define is_alpha(c) (is_ascii(c) && isalpha(c))
|
||||||
|
#define is_alnum(c) (is_ascii(c) && isalnum(c))
|
||||||
|
|
||||||
|
/* Scanning macros */
|
||||||
|
#define isidchar(ch) (is_alnum(ch) || (ch) == '_')
|
||||||
|
#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_')
|
||||||
|
|
||||||
|
/* Forward references */
|
||||||
|
char *skipspace();
|
||||||
|
int writeblanks();
|
||||||
|
int test1();
|
||||||
|
int convert1();
|
||||||
|
|
||||||
|
/* The main program */
|
||||||
|
int
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{ FILE *in = stdin;
|
||||||
|
FILE *out = stdout;
|
||||||
|
char *filename = 0;
|
||||||
|
#define bufsize 5000 /* arbitrary size */
|
||||||
|
char *buf;
|
||||||
|
char *line;
|
||||||
|
char *more;
|
||||||
|
char *usage =
|
||||||
|
"Usage: ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]\n";
|
||||||
|
/*
|
||||||
|
* In previous versions, ansi2knr recognized a --varargs switch.
|
||||||
|
* If this switch was supplied, ansi2knr would attempt to convert
|
||||||
|
* a ... argument to va_alist and va_dcl; if this switch was not
|
||||||
|
* supplied, ansi2knr would simply drop any such arguments.
|
||||||
|
* Now, ansi2knr always does this conversion, and we only
|
||||||
|
* check for this switch for backward compatibility.
|
||||||
|
*/
|
||||||
|
int convert_varargs = 1;
|
||||||
|
|
||||||
|
while ( argc > 1 && argv[1][0] == '-' ) {
|
||||||
|
if ( !strcmp(argv[1], "--varargs") ) {
|
||||||
|
convert_varargs = 1;
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ( !strcmp(argv[1], "--filename") && argc > 2 ) {
|
||||||
|
filename = argv[2];
|
||||||
|
argc -= 2;
|
||||||
|
argv += 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "Unrecognized switch: %s\n", argv[1]);
|
||||||
|
fprintf(stderr, usage);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
switch ( argc )
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
fprintf(stderr, usage);
|
||||||
|
exit(0);
|
||||||
|
case 3:
|
||||||
|
out = fopen(argv[2], "w");
|
||||||
|
if ( out == NULL ) {
|
||||||
|
fprintf(stderr, "Cannot open output file %s\n", argv[2]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* falls through */
|
||||||
|
case 2:
|
||||||
|
in = fopen(argv[1], "r");
|
||||||
|
if ( in == NULL ) {
|
||||||
|
fprintf(stderr, "Cannot open input file %s\n", argv[1]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if ( filename == 0 )
|
||||||
|
filename = argv[1];
|
||||||
|
/* falls through */
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( filename )
|
||||||
|
fprintf(out, "#line 1 \"%s\"\n", filename);
|
||||||
|
buf = malloc(bufsize);
|
||||||
|
line = buf;
|
||||||
|
while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
|
||||||
|
{
|
||||||
|
test: line += strlen(line);
|
||||||
|
switch ( test1(buf) )
|
||||||
|
{
|
||||||
|
case 2: /* a function header */
|
||||||
|
convert1(buf, out, 1, convert_varargs);
|
||||||
|
break;
|
||||||
|
case 1: /* a function */
|
||||||
|
/* Check for a { at the start of the next line. */
|
||||||
|
more = ++line;
|
||||||
|
f: if ( line >= buf + (bufsize - 1) ) /* overflow check */
|
||||||
|
goto wl;
|
||||||
|
if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL )
|
||||||
|
goto wl;
|
||||||
|
switch ( *skipspace(more, 1) )
|
||||||
|
{
|
||||||
|
case '{':
|
||||||
|
/* Definitely a function header. */
|
||||||
|
convert1(buf, out, 0, convert_varargs);
|
||||||
|
fputs(more, out);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
/* The next line was blank or a comment: */
|
||||||
|
/* keep scanning for a non-comment. */
|
||||||
|
line += strlen(line);
|
||||||
|
goto f;
|
||||||
|
default:
|
||||||
|
/* buf isn't a function header, but */
|
||||||
|
/* more might be. */
|
||||||
|
fputs(buf, out);
|
||||||
|
strcpy(buf, more);
|
||||||
|
line = buf;
|
||||||
|
goto test;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case -1: /* maybe the start of a function */
|
||||||
|
if ( line != buf + (bufsize - 1) ) /* overflow check */
|
||||||
|
continue;
|
||||||
|
/* falls through */
|
||||||
|
default: /* not a function */
|
||||||
|
wl: fputs(buf, out);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
line = buf;
|
||||||
|
}
|
||||||
|
if ( line != buf )
|
||||||
|
fputs(buf, out);
|
||||||
|
free(buf);
|
||||||
|
if ( out != stdout )
|
||||||
|
fclose(out);
|
||||||
|
if ( in != stdin )
|
||||||
|
fclose(in);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip over space and comments, in either direction. */
|
||||||
|
char *
|
||||||
|
skipspace(p, dir)
|
||||||
|
register char *p;
|
||||||
|
register int dir; /* 1 for forward, -1 for backward */
|
||||||
|
{ for ( ; ; )
|
||||||
|
{ while ( is_space(*p) )
|
||||||
|
p += dir;
|
||||||
|
if ( !(*p == '/' && p[dir] == '*') )
|
||||||
|
break;
|
||||||
|
p += dir; p += dir;
|
||||||
|
while ( !(*p == '*' && p[dir] == '/') )
|
||||||
|
{ if ( *p == 0 )
|
||||||
|
return p; /* multi-line comment?? */
|
||||||
|
p += dir;
|
||||||
|
}
|
||||||
|
p += dir; p += dir;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write blanks over part of a string.
|
||||||
|
* Don't overwrite end-of-line characters.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
writeblanks(start, end)
|
||||||
|
char *start;
|
||||||
|
char *end;
|
||||||
|
{ char *p;
|
||||||
|
for ( p = start; p < end; p++ )
|
||||||
|
if ( *p != '\r' && *p != '\n' )
|
||||||
|
*p = ' ';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test whether the string in buf is a function definition.
|
||||||
|
* The string may contain and/or end with a newline.
|
||||||
|
* Return as follows:
|
||||||
|
* 0 - definitely not a function definition;
|
||||||
|
* 1 - definitely a function definition;
|
||||||
|
* 2 - definitely a function prototype (NOT USED);
|
||||||
|
* -1 - may be the beginning of a function definition,
|
||||||
|
* append another line and look again.
|
||||||
|
* The reason we don't attempt to convert function prototypes is that
|
||||||
|
* Ghostscript's declaration-generating macros look too much like
|
||||||
|
* prototypes, and confuse the algorithms.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
test1(buf)
|
||||||
|
char *buf;
|
||||||
|
{ register char *p = buf;
|
||||||
|
char *bend;
|
||||||
|
char *endfn;
|
||||||
|
int contin;
|
||||||
|
|
||||||
|
if ( !isidfirstchar(*p) )
|
||||||
|
return 0; /* no name at left margin */
|
||||||
|
bend = skipspace(buf + strlen(buf) - 1, -1);
|
||||||
|
switch ( *bend )
|
||||||
|
{
|
||||||
|
case ';': contin = 0 /*2*/; break;
|
||||||
|
case ')': contin = 1; break;
|
||||||
|
case '{': return 0; /* not a function */
|
||||||
|
case '}': return 0; /* not a function */
|
||||||
|
default: contin = -1;
|
||||||
|
}
|
||||||
|
while ( isidchar(*p) )
|
||||||
|
p++;
|
||||||
|
endfn = p;
|
||||||
|
p = skipspace(p, 1);
|
||||||
|
if ( *p++ != '(' )
|
||||||
|
return 0; /* not a function */
|
||||||
|
p = skipspace(p, 1);
|
||||||
|
if ( *p == ')' )
|
||||||
|
return 0; /* no parameters */
|
||||||
|
/* Check that the apparent function name isn't a keyword. */
|
||||||
|
/* We only need to check for keywords that could be followed */
|
||||||
|
/* by a left parenthesis (which, unfortunately, is most of them). */
|
||||||
|
{ static char *words[] =
|
||||||
|
{ "asm", "auto", "case", "char", "const", "double",
|
||||||
|
"extern", "float", "for", "if", "int", "long",
|
||||||
|
"register", "return", "short", "signed", "sizeof",
|
||||||
|
"static", "switch", "typedef", "unsigned",
|
||||||
|
"void", "volatile", "while", 0
|
||||||
|
};
|
||||||
|
char **key = words;
|
||||||
|
char *kp;
|
||||||
|
int len = endfn - buf;
|
||||||
|
|
||||||
|
while ( (kp = *key) != 0 )
|
||||||
|
{ if ( strlen(kp) == len && !strncmp(kp, buf, len) )
|
||||||
|
return 0; /* name is a keyword */
|
||||||
|
key++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return contin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert a recognized function definition or header to K&R syntax. */
|
||||||
|
int
|
||||||
|
convert1(buf, out, header, convert_varargs)
|
||||||
|
char *buf;
|
||||||
|
FILE *out;
|
||||||
|
int header; /* Boolean */
|
||||||
|
int convert_varargs; /* Boolean */
|
||||||
|
{ char *endfn;
|
||||||
|
register char *p;
|
||||||
|
/*
|
||||||
|
* The breaks table contains pointers to the beginning and end
|
||||||
|
* of each argument.
|
||||||
|
*/
|
||||||
|
char **breaks;
|
||||||
|
unsigned num_breaks = 2; /* for testing */
|
||||||
|
char **btop;
|
||||||
|
char **bp;
|
||||||
|
char **ap;
|
||||||
|
char *vararg = 0;
|
||||||
|
|
||||||
|
/* Pre-ANSI implementations don't agree on whether strchr */
|
||||||
|
/* is called strchr or index, so we open-code it here. */
|
||||||
|
for ( endfn = buf; *(endfn++) != '('; )
|
||||||
|
;
|
||||||
|
top: p = endfn;
|
||||||
|
breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
|
||||||
|
if ( breaks == 0 )
|
||||||
|
{ /* Couldn't allocate break table, give up */
|
||||||
|
fprintf(stderr, "Unable to allocate break table!\n");
|
||||||
|
fputs(buf, out);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
btop = breaks + num_breaks * 2 - 2;
|
||||||
|
bp = breaks;
|
||||||
|
/* Parse the argument list */
|
||||||
|
do
|
||||||
|
{ int level = 0;
|
||||||
|
char *lp = NULL;
|
||||||
|
char *rp;
|
||||||
|
char *end = NULL;
|
||||||
|
|
||||||
|
if ( bp >= btop )
|
||||||
|
{ /* Filled up break table. */
|
||||||
|
/* Allocate a bigger one and start over. */
|
||||||
|
free((char *)breaks);
|
||||||
|
num_breaks <<= 1;
|
||||||
|
goto top;
|
||||||
|
}
|
||||||
|
*bp++ = p;
|
||||||
|
/* Find the end of the argument */
|
||||||
|
for ( ; end == NULL; p++ )
|
||||||
|
{ switch(*p)
|
||||||
|
{
|
||||||
|
case ',':
|
||||||
|
if ( !level ) end = p;
|
||||||
|
break;
|
||||||
|
case '(':
|
||||||
|
if ( !level ) lp = p;
|
||||||
|
level++;
|
||||||
|
break;
|
||||||
|
case ')':
|
||||||
|
if ( --level < 0 ) end = p;
|
||||||
|
else rp = p;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
p = skipspace(p, 1) - 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Erase any embedded prototype parameters. */
|
||||||
|
if ( lp )
|
||||||
|
writeblanks(lp + 1, rp);
|
||||||
|
p--; /* back up over terminator */
|
||||||
|
/* Find the name being declared. */
|
||||||
|
/* This is complicated because of procedure and */
|
||||||
|
/* array modifiers. */
|
||||||
|
for ( ; ; )
|
||||||
|
{ p = skipspace(p - 1, -1);
|
||||||
|
switch ( *p )
|
||||||
|
{
|
||||||
|
case ']': /* skip array dimension(s) */
|
||||||
|
case ')': /* skip procedure args OR name */
|
||||||
|
{ int level = 1;
|
||||||
|
while ( level )
|
||||||
|
switch ( *--p )
|
||||||
|
{
|
||||||
|
case ']': case ')': level++; break;
|
||||||
|
case '[': case '(': level--; break;
|
||||||
|
case '/': p = skipspace(p, -1) + 1; break;
|
||||||
|
default: ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
|
||||||
|
{ /* We found the name being declared */
|
||||||
|
while ( !isidfirstchar(*p) )
|
||||||
|
p = skipspace(p, 1) + 1;
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
found: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
|
||||||
|
{ if ( convert_varargs )
|
||||||
|
{ *bp++ = "va_alist";
|
||||||
|
vararg = p-2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ p++;
|
||||||
|
if ( bp == breaks + 1 ) /* sole argument */
|
||||||
|
writeblanks(breaks[0], p);
|
||||||
|
else
|
||||||
|
writeblanks(bp[-1] - 1, p);
|
||||||
|
bp--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ while ( isidchar(*p) ) p--;
|
||||||
|
*bp++ = p+1;
|
||||||
|
}
|
||||||
|
p = end;
|
||||||
|
}
|
||||||
|
while ( *p++ == ',' );
|
||||||
|
*bp = p;
|
||||||
|
/* Make a special check for 'void' arglist */
|
||||||
|
if ( bp == breaks+2 )
|
||||||
|
{ p = skipspace(breaks[0], 1);
|
||||||
|
if ( !strncmp(p, "void", 4) )
|
||||||
|
{ p = skipspace(p+4, 1);
|
||||||
|
if ( p == breaks[2] - 1 )
|
||||||
|
{ bp = breaks; /* yup, pretend arglist is empty */
|
||||||
|
writeblanks(breaks[0], p + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Put out the function name and left parenthesis. */
|
||||||
|
p = buf;
|
||||||
|
while ( p != endfn ) putc(*p, out), p++;
|
||||||
|
/* Put out the declaration. */
|
||||||
|
if ( header )
|
||||||
|
{ fputs(");", out);
|
||||||
|
for ( p = breaks[0]; *p; p++ )
|
||||||
|
if ( *p == '\r' || *p == '\n' )
|
||||||
|
putc(*p, out);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ for ( ap = breaks+1; ap < bp; ap += 2 )
|
||||||
|
{ p = *ap;
|
||||||
|
while ( isidchar(*p) )
|
||||||
|
putc(*p, out), p++;
|
||||||
|
if ( ap < bp - 1 )
|
||||||
|
fputs(", ", out);
|
||||||
|
}
|
||||||
|
fputs(") ", out);
|
||||||
|
/* Put out the argument declarations */
|
||||||
|
for ( ap = breaks+2; ap <= bp; ap += 2 )
|
||||||
|
(*ap)[-1] = ';';
|
||||||
|
if ( vararg != 0 )
|
||||||
|
{ *vararg = 0;
|
||||||
|
fputs(breaks[0], out); /* any prior args */
|
||||||
|
fputs("va_dcl", out); /* the final arg */
|
||||||
|
fputs(bp[0], out);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fputs(breaks[0], out);
|
||||||
|
}
|
||||||
|
free((char *)breaks);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
975
config.guess
vendored
Executable file
975
config.guess
vendored
Executable file
@@ -0,0 +1,975 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Attempt to guess a canonical system name.
|
||||||
|
# Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Written by Per Bothner <bothner@cygnus.com>.
|
||||||
|
# The master version of this file is at the FSF in /home/gd/gnu/lib.
|
||||||
|
# Please send patches to the Autoconf mailing list <autoconf@gnu.org>.
|
||||||
|
#
|
||||||
|
# This script attempts to guess a canonical system name similar to
|
||||||
|
# config.sub. If it succeeds, it prints the system name on stdout, and
|
||||||
|
# exits with 0. Otherwise, it exits with 1.
|
||||||
|
#
|
||||||
|
# The plan is that this can be called by configure scripts if you
|
||||||
|
# don't specify an explicit system type (host/target name).
|
||||||
|
#
|
||||||
|
# Only a few systems have been added to this list; please add others
|
||||||
|
# (but try to keep the structure clean).
|
||||||
|
#
|
||||||
|
|
||||||
|
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
|
||||||
|
# (ghazi@noc.rutgers.edu 8/24/94.)
|
||||||
|
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
|
||||||
|
PATH=$PATH:/.attbin ; export PATH
|
||||||
|
fi
|
||||||
|
|
||||||
|
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
|
||||||
|
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
|
||||||
|
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
|
||||||
|
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
|
||||||
|
|
||||||
|
dummy=dummy-$$
|
||||||
|
trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
|
||||||
|
|
||||||
|
# Note: order is significant - the case branches are not exclusive.
|
||||||
|
|
||||||
|
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||||
|
alpha:OSF1:*:*)
|
||||||
|
if test $UNAME_RELEASE = "V4.0"; then
|
||||||
|
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
||||||
|
fi
|
||||||
|
# A Vn.n version is a released version.
|
||||||
|
# A Tn.n version is a released field test version.
|
||||||
|
# A Xn.n version is an unreleased experimental baselevel.
|
||||||
|
# 1.2 uses "1.2" for uname -r.
|
||||||
|
cat <<EOF >$dummy.s
|
||||||
|
.globl main
|
||||||
|
.ent main
|
||||||
|
main:
|
||||||
|
.frame \$30,0,\$26,0
|
||||||
|
.prologue 0
|
||||||
|
.long 0x47e03d80 # implver $0
|
||||||
|
lda \$2,259
|
||||||
|
.long 0x47e20c21 # amask $2,$1
|
||||||
|
srl \$1,8,\$2
|
||||||
|
sll \$2,2,\$2
|
||||||
|
sll \$0,3,\$0
|
||||||
|
addl \$1,\$0,\$0
|
||||||
|
addl \$2,\$0,\$0
|
||||||
|
ret \$31,(\$26),1
|
||||||
|
.end main
|
||||||
|
EOF
|
||||||
|
${CC-cc} $dummy.s -o $dummy 2>/dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
./$dummy
|
||||||
|
case "$?" in
|
||||||
|
7)
|
||||||
|
UNAME_MACHINE="alpha"
|
||||||
|
;;
|
||||||
|
15)
|
||||||
|
UNAME_MACHINE="alphaev5"
|
||||||
|
;;
|
||||||
|
14)
|
||||||
|
UNAME_MACHINE="alphaev56"
|
||||||
|
;;
|
||||||
|
10)
|
||||||
|
UNAME_MACHINE="alphapca56"
|
||||||
|
;;
|
||||||
|
16)
|
||||||
|
UNAME_MACHINE="alphaev6"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
rm -f $dummy.s $dummy
|
||||||
|
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
|
||||||
|
exit 0 ;;
|
||||||
|
21064:Windows_NT:50:3)
|
||||||
|
echo alpha-dec-winnt3.5
|
||||||
|
exit 0 ;;
|
||||||
|
Amiga*:UNIX_System_V:4.0:*)
|
||||||
|
echo m68k-cbm-sysv4
|
||||||
|
exit 0;;
|
||||||
|
amiga:NetBSD:*:*)
|
||||||
|
echo m68k-cbm-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
amiga:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
*:[Aa]miga[Oo][Ss]:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-amigaos
|
||||||
|
exit 0 ;;
|
||||||
|
arc64:OpenBSD:*:*)
|
||||||
|
echo mips64el-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
arc:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
hkmips:OpenBSD:*:*)
|
||||||
|
echo mips-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
pmax:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sgi:OpenBSD:*:*)
|
||||||
|
echo mips-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
wgrisc:OpenBSD:*:*)
|
||||||
|
echo mipsel-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
||||||
|
echo arm-acorn-riscix${UNAME_RELEASE}
|
||||||
|
exit 0;;
|
||||||
|
arm32:NetBSD:*:*)
|
||||||
|
echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||||
|
exit 0 ;;
|
||||||
|
SR2?01:HI-UX/MPP:*:*)
|
||||||
|
echo hppa1.1-hitachi-hiuxmpp
|
||||||
|
exit 0;;
|
||||||
|
Pyramid*:OSx*:*:*|MIS*:OSx*:*:*|MIS*:SMP_DC-OSx*:*:*)
|
||||||
|
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
|
||||||
|
if test "`(/bin/universe) 2>/dev/null`" = att ; then
|
||||||
|
echo pyramid-pyramid-sysv3
|
||||||
|
else
|
||||||
|
echo pyramid-pyramid-bsd
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
NILE*:*:*:dcosx)
|
||||||
|
echo pyramid-pyramid-svr4
|
||||||
|
exit 0 ;;
|
||||||
|
sun4H:SunOS:5.*:*)
|
||||||
|
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
||||||
|
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
i86pc:SunOS:5.*:*)
|
||||||
|
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
sun4*:SunOS:6*:*)
|
||||||
|
# According to config.sub, this is the proper way to canonicalize
|
||||||
|
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
|
||||||
|
# it's likely to be more like Solaris than SunOS4.
|
||||||
|
echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
sun4*:SunOS:*:*)
|
||||||
|
case "`/usr/bin/arch -k`" in
|
||||||
|
Series*|S4*)
|
||||||
|
UNAME_RELEASE=`uname -v`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# Japanese Language versions have a version number like `4.1.3-JL'.
|
||||||
|
echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
|
||||||
|
exit 0 ;;
|
||||||
|
sun3*:SunOS:*:*)
|
||||||
|
echo m68k-sun-sunos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sun*:*:4.2BSD:*)
|
||||||
|
UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
|
||||||
|
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
|
||||||
|
case "`/bin/arch`" in
|
||||||
|
sun3)
|
||||||
|
echo m68k-sun-sunos${UNAME_RELEASE}
|
||||||
|
;;
|
||||||
|
sun4)
|
||||||
|
echo sparc-sun-sunos${UNAME_RELEASE}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit 0 ;;
|
||||||
|
aushp:SunOS:*:*)
|
||||||
|
echo sparc-auspex-sunos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
atari*:NetBSD:*:*)
|
||||||
|
echo m68k-atari-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
atari*:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sun3*:NetBSD:*:*)
|
||||||
|
echo m68k-sun-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sun3*:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mac68k:NetBSD:*:*)
|
||||||
|
echo m68k-apple-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mac68k:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mvme68k:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mvme88k:OpenBSD:*:*)
|
||||||
|
echo m88k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
powerpc:machten:*:*)
|
||||||
|
echo powerpc-apple-machten${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
macppc:NetBSD:*:*)
|
||||||
|
echo powerpc-apple-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
RISC*:Mach:*:*)
|
||||||
|
echo mips-dec-mach_bsd4.3
|
||||||
|
exit 0 ;;
|
||||||
|
RISC*:ULTRIX:*:*)
|
||||||
|
echo mips-dec-ultrix${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
VAX*:ULTRIX*:*:*)
|
||||||
|
echo vax-dec-ultrix${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
2020:CLIX:*:*)
|
||||||
|
echo clipper-intergraph-clix${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mips:*:*:UMIPS | mips:*:*:RISCos)
|
||||||
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
|
int main (argc, argv) int argc; char **argv; {
|
||||||
|
#if defined (host_mips) && defined (MIPSEB)
|
||||||
|
#if defined (SYSTYPE_SYSV)
|
||||||
|
printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
|
||||||
|
#endif
|
||||||
|
#if defined (SYSTYPE_SVR4)
|
||||||
|
printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
|
||||||
|
#endif
|
||||||
|
#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
|
||||||
|
printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} $dummy.c -o $dummy \
|
||||||
|
&& ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
|
||||||
|
&& rm $dummy.c $dummy && exit 0
|
||||||
|
rm -f $dummy.c $dummy
|
||||||
|
echo mips-mips-riscos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
Night_Hawk:Power_UNIX:*:*)
|
||||||
|
echo powerpc-harris-powerunix
|
||||||
|
exit 0 ;;
|
||||||
|
m88k:CX/UX:7*:*)
|
||||||
|
echo m88k-harris-cxux7
|
||||||
|
exit 0 ;;
|
||||||
|
m88k:*:4*:R4*)
|
||||||
|
echo m88k-motorola-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
m88k:*:3*:R3*)
|
||||||
|
echo m88k-motorola-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
AViiON:dgux:*:*)
|
||||||
|
# DG/UX returns AViiON for all architectures
|
||||||
|
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||||
|
if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
|
||||||
|
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
|
||||||
|
-o ${TARGET_BINARY_INTERFACE}x = x ] ; then
|
||||||
|
echo m88k-dg-dgux${UNAME_RELEASE}
|
||||||
|
else
|
||||||
|
echo m88k-dg-dguxbcs${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
else echo i586-dg-dgux${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
|
||||||
|
echo m88k-dolphin-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
M88*:*:R3*:*)
|
||||||
|
# Delta 88k system running SVR3
|
||||||
|
echo m88k-motorola-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
|
||||||
|
echo m88k-tektronix-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
|
||||||
|
echo m68k-tektronix-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
*:IRIX*:*:*)
|
||||||
|
echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
|
||||||
|
exit 0 ;;
|
||||||
|
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
|
||||||
|
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
|
||||||
|
exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
|
||||||
|
i?86:AIX:*:*)
|
||||||
|
echo i386-ibm-aix
|
||||||
|
exit 0 ;;
|
||||||
|
*:AIX:2:3)
|
||||||
|
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
|
||||||
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
|
#include <sys/systemcfg.h>
|
||||||
|
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
if (!__power_pc())
|
||||||
|
exit(1);
|
||||||
|
puts("powerpc-ibm-aix3.2.5");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
|
||||||
|
rm -f $dummy.c $dummy
|
||||||
|
echo rs6000-ibm-aix3.2.5
|
||||||
|
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
|
||||||
|
echo rs6000-ibm-aix3.2.4
|
||||||
|
else
|
||||||
|
echo rs6000-ibm-aix3.2
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
*:AIX:*:4)
|
||||||
|
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
|
||||||
|
if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
|
||||||
|
IBM_ARCH=rs6000
|
||||||
|
else
|
||||||
|
IBM_ARCH=powerpc
|
||||||
|
fi
|
||||||
|
if [ -x /usr/bin/oslevel ] ; then
|
||||||
|
IBM_REV=`/usr/bin/oslevel`
|
||||||
|
else
|
||||||
|
IBM_REV=4.${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
echo ${IBM_ARCH}-ibm-aix${IBM_REV}
|
||||||
|
exit 0 ;;
|
||||||
|
*:AIX:*:*)
|
||||||
|
echo rs6000-ibm-aix
|
||||||
|
exit 0 ;;
|
||||||
|
ibmrt:4.4BSD:*|romp-ibm:BSD:*)
|
||||||
|
echo romp-ibm-bsd4.4
|
||||||
|
exit 0 ;;
|
||||||
|
ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
|
||||||
|
echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
|
||||||
|
exit 0 ;; # report: romp-ibm BSD 4.3
|
||||||
|
*:BOSX:*:*)
|
||||||
|
echo rs6000-bull-bosx
|
||||||
|
exit 0 ;;
|
||||||
|
DPX/2?00:B.O.S.:*:*)
|
||||||
|
echo m68k-bull-sysv3
|
||||||
|
exit 0 ;;
|
||||||
|
9000/[34]??:4.3bsd:1.*:*)
|
||||||
|
echo m68k-hp-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
|
||||||
|
echo m68k-hp-bsd4.4
|
||||||
|
exit 0 ;;
|
||||||
|
9000/[34678]??:HP-UX:*:*)
|
||||||
|
case "${UNAME_MACHINE}" in
|
||||||
|
9000/31? ) HP_ARCH=m68000 ;;
|
||||||
|
9000/[34]?? ) HP_ARCH=m68k ;;
|
||||||
|
9000/6?? | 9000/7?? | 9000/80[24] | 9000/8?[13679] | 9000/892 )
|
||||||
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
#if defined(_SC_KERNEL_BITS)
|
||||||
|
long bits = sysconf(_SC_KERNEL_BITS);
|
||||||
|
#endif
|
||||||
|
long cpu = sysconf (_SC_CPU_VERSION);
|
||||||
|
|
||||||
|
switch (cpu)
|
||||||
|
{
|
||||||
|
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
|
||||||
|
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
|
||||||
|
case CPU_PA_RISC2_0:
|
||||||
|
#if defined(_SC_KERNEL_BITS)
|
||||||
|
switch (bits)
|
||||||
|
{
|
||||||
|
case 64: puts ("hppa2.0w"); break;
|
||||||
|
case 32: puts ("hppa2.0n"); break;
|
||||||
|
default: puts ("hppa2.0"); break;
|
||||||
|
} break;
|
||||||
|
#else /* !defined(_SC_KERNEL_BITS) */
|
||||||
|
puts ("hppa2.0"); break;
|
||||||
|
#endif
|
||||||
|
default: puts ("hppa1.0"); break;
|
||||||
|
}
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
(${CC-cc} $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
|
||||||
|
rm -f $dummy.c $dummy
|
||||||
|
esac
|
||||||
|
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
|
||||||
|
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
|
||||||
|
exit 0 ;;
|
||||||
|
3050*:HI-UX:*:*)
|
||||||
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
|
#include <unistd.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
long cpu = sysconf (_SC_CPU_VERSION);
|
||||||
|
/* The order matters, because CPU_IS_HP_MC68K erroneously returns
|
||||||
|
true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
|
||||||
|
results, however. */
|
||||||
|
if (CPU_IS_PA_RISC (cpu))
|
||||||
|
{
|
||||||
|
switch (cpu)
|
||||||
|
{
|
||||||
|
case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
|
||||||
|
case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
|
||||||
|
case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
|
||||||
|
default: puts ("hppa-hitachi-hiuxwe2"); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (CPU_IS_HP_MC68K (cpu))
|
||||||
|
puts ("m68k-hitachi-hiuxwe2");
|
||||||
|
else puts ("unknown-hitachi-hiuxwe2");
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
|
||||||
|
rm -f $dummy.c $dummy
|
||||||
|
echo unknown-hitachi-hiuxwe2
|
||||||
|
exit 0 ;;
|
||||||
|
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
|
||||||
|
echo hppa1.1-hp-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
9000/8??:4.3bsd:*:*)
|
||||||
|
echo hppa1.0-hp-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
|
||||||
|
echo hppa1.1-hp-osf
|
||||||
|
exit 0 ;;
|
||||||
|
hp8??:OSF1:*:*)
|
||||||
|
echo hppa1.0-hp-osf
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:OSF1:*:*)
|
||||||
|
if [ -x /usr/sbin/sysversion ] ; then
|
||||||
|
echo ${UNAME_MACHINE}-unknown-osf1mk
|
||||||
|
else
|
||||||
|
echo ${UNAME_MACHINE}-unknown-osf1
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
parisc*:Lites*:*:*)
|
||||||
|
echo hppa1.1-hp-lites
|
||||||
|
exit 0 ;;
|
||||||
|
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
|
||||||
|
echo c1-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
|
||||||
|
if getsysinfo -f scalar_acc
|
||||||
|
then echo c32-convex-bsd
|
||||||
|
else echo c2-convex-bsd
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
|
||||||
|
echo c34-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
|
||||||
|
echo c38-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
|
||||||
|
echo c4-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*X-MP:*:*:*)
|
||||||
|
echo xmp-cray-unicos
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*Y-MP:*:*:*)
|
||||||
|
echo ymp-cray-unicos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*[A-Z]90:*:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
|
||||||
|
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
|
||||||
|
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*TS:*:*:*)
|
||||||
|
echo t90-cray-unicos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY*T3E:*:*:*)
|
||||||
|
echo t3e-cray-unicosmk${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
CRAY-2:*:*:*)
|
||||||
|
echo cray2-cray-unicos
|
||||||
|
exit 0 ;;
|
||||||
|
F300:UNIX_System_V:*:*)
|
||||||
|
FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
|
||||||
|
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
||||||
|
echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||||
|
exit 0 ;;
|
||||||
|
F301:UNIX_System_V:*:*)
|
||||||
|
echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
hp3[0-9][05]:NetBSD:*:*)
|
||||||
|
echo m68k-hp-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
hp300:OpenBSD:*:*)
|
||||||
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
sparc*:BSD/OS:*:*)
|
||||||
|
echo sparc-unknown-bsdi${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:BSD/386:*:* | i?86:BSD/OS:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
*:BSD/OS:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
*:FreeBSD:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
*:NetBSD:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||||
|
exit 0 ;;
|
||||||
|
*:OpenBSD:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
|
||||||
|
exit 0 ;;
|
||||||
|
i*:CYGWIN*:*)
|
||||||
|
echo ${UNAME_MACHINE}-pc-cygwin
|
||||||
|
exit 0 ;;
|
||||||
|
i*:MINGW*:*)
|
||||||
|
echo ${UNAME_MACHINE}-pc-mingw32
|
||||||
|
exit 0 ;;
|
||||||
|
p*:CYGWIN*:*)
|
||||||
|
echo powerpcle-unknown-cygwin
|
||||||
|
exit 0 ;;
|
||||||
|
prep*:SunOS:5.*:*)
|
||||||
|
echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit 0 ;;
|
||||||
|
*:GNU:*:*)
|
||||||
|
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
|
||||||
|
exit 0 ;;
|
||||||
|
*:Linux:*:*)
|
||||||
|
# uname on the ARM produces all sorts of strangeness, and we need to
|
||||||
|
# filter it out.
|
||||||
|
case "$UNAME_MACHINE" in
|
||||||
|
armv*) ;;
|
||||||
|
arm* | sa110*) UNAME_MACHINE="arm" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# The BFD linker knows what the default object file format is, so
|
||||||
|
# first see if it will tell us.
|
||||||
|
ld_help_string=`ld --help 2>&1`
|
||||||
|
ld_supported_emulations=`echo $ld_help_string \
|
||||||
|
| sed -ne '/supported emulations:/!d
|
||||||
|
s/[ ][ ]*/ /g
|
||||||
|
s/.*supported emulations: *//
|
||||||
|
s/ .*//
|
||||||
|
p'`
|
||||||
|
case "$ld_supported_emulations" in
|
||||||
|
i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
|
||||||
|
i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
|
||||||
|
sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||||
|
armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||||
|
m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
|
||||||
|
elf32ppc) echo "powerpc-unknown-linux-gnu" ; exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if test "${UNAME_MACHINE}" = "alpha" ; then
|
||||||
|
sed 's/^ //' <<EOF >$dummy.s
|
||||||
|
.globl main
|
||||||
|
.ent main
|
||||||
|
main:
|
||||||
|
.frame \$30,0,\$26,0
|
||||||
|
.prologue 0
|
||||||
|
.long 0x47e03d80 # implver $0
|
||||||
|
lda \$2,259
|
||||||
|
.long 0x47e20c21 # amask $2,$1
|
||||||
|
srl \$1,8,\$2
|
||||||
|
sll \$2,2,\$2
|
||||||
|
sll \$0,3,\$0
|
||||||
|
addl \$1,\$0,\$0
|
||||||
|
addl \$2,\$0,\$0
|
||||||
|
ret \$31,(\$26),1
|
||||||
|
.end main
|
||||||
|
EOF
|
||||||
|
LIBC=""
|
||||||
|
${CC-cc} $dummy.s -o $dummy 2>/dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
./$dummy
|
||||||
|
case "$?" in
|
||||||
|
7)
|
||||||
|
UNAME_MACHINE="alpha"
|
||||||
|
;;
|
||||||
|
15)
|
||||||
|
UNAME_MACHINE="alphaev5"
|
||||||
|
;;
|
||||||
|
14)
|
||||||
|
UNAME_MACHINE="alphaev56"
|
||||||
|
;;
|
||||||
|
10)
|
||||||
|
UNAME_MACHINE="alphapca56"
|
||||||
|
;;
|
||||||
|
16)
|
||||||
|
UNAME_MACHINE="alphaev6"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
objdump --private-headers $dummy | \
|
||||||
|
grep ld.so.1 > /dev/null
|
||||||
|
if test "$?" = 0 ; then
|
||||||
|
LIBC="libc1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -f $dummy.s $dummy
|
||||||
|
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
|
||||||
|
elif test "${UNAME_MACHINE}" = "mips" ; then
|
||||||
|
cat >$dummy.c <<EOF
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
#ifdef __MIPSEB__
|
||||||
|
printf ("%s-unknown-linux-gnu\n", argv[1]);
|
||||||
|
#endif
|
||||||
|
#ifdef __MIPSEL__
|
||||||
|
printf ("%sel-unknown-linux-gnu\n", argv[1]);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
|
||||||
|
rm -f $dummy.c $dummy
|
||||||
|
else
|
||||||
|
# Either a pre-BFD a.out linker (linux-gnuoldld)
|
||||||
|
# or one that does not give us useful --help.
|
||||||
|
# GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
|
||||||
|
# If ld does not provide *any* "supported emulations:"
|
||||||
|
# that means it is gnuoldld.
|
||||||
|
echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
|
||||||
|
test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
|
||||||
|
|
||||||
|
case "${UNAME_MACHINE}" in
|
||||||
|
i?86)
|
||||||
|
VENDOR=pc;
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
VENDOR=unknown;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# Determine whether the default compiler is a.out or elf
|
||||||
|
cat >$dummy.c <<EOF
|
||||||
|
#include <features.h>
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
#ifdef __ELF__
|
||||||
|
# ifdef __GLIBC__
|
||||||
|
# if __GLIBC__ >= 2
|
||||||
|
printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
|
||||||
|
# else
|
||||||
|
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
|
||||||
|
rm -f $dummy.c $dummy
|
||||||
|
fi ;;
|
||||||
|
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
|
||||||
|
# are messed up and put the nodename in both sysname and nodename.
|
||||||
|
i?86:DYNIX/ptx:4*:*)
|
||||||
|
echo i386-sequent-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:UNIX_SV:4.2MP:2.*)
|
||||||
|
# Unixware is an offshoot of SVR4, but it has its own version
|
||||||
|
# number series starting with 2...
|
||||||
|
# I am not positive that other SVR4 systems won't match this,
|
||||||
|
# I just have to hope. -- rms.
|
||||||
|
# Use sysv4.2uw... so that sysv4* matches it.
|
||||||
|
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
|
||||||
|
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
|
||||||
|
echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
|
||||||
|
else
|
||||||
|
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:*:3.2:*)
|
||||||
|
if test -f /usr/options/cb.name; then
|
||||||
|
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
|
||||||
|
echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
|
||||||
|
elif /bin/uname -X 2>/dev/null >/dev/null ; then
|
||||||
|
UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
|
||||||
|
(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
|
||||||
|
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
|
||||||
|
&& UNAME_MACHINE=i586
|
||||||
|
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
|
||||||
|
else
|
||||||
|
echo ${UNAME_MACHINE}-pc-sysv32
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:UnixWare:*:*)
|
||||||
|
if /bin/uname -X 2>/dev/null >/dev/null ; then
|
||||||
|
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
|
||||||
|
&& UNAME_MACHINE=i586
|
||||||
|
fi
|
||||||
|
echo ${UNAME_MACHINE}-unixware-${UNAME_RELEASE}-${UNAME_VERSION}
|
||||||
|
exit 0 ;;
|
||||||
|
pc:*:*:*)
|
||||||
|
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||||
|
# the processor, so we play safe by assuming i386.
|
||||||
|
echo i386-pc-msdosdjgpp
|
||||||
|
exit 0 ;;
|
||||||
|
Intel:Mach:3*:*)
|
||||||
|
echo i386-pc-mach3
|
||||||
|
exit 0 ;;
|
||||||
|
paragon:*:*:*)
|
||||||
|
echo i860-intel-osf1
|
||||||
|
exit 0 ;;
|
||||||
|
i860:*:4.*:*) # i860-SVR4
|
||||||
|
if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
|
||||||
|
echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
|
||||||
|
else # Add other i860-SVR4 vendors below as they are discovered.
|
||||||
|
echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
mini*:CTIX:SYS*5:*)
|
||||||
|
# "miniframe"
|
||||||
|
echo m68010-convergent-sysv
|
||||||
|
exit 0 ;;
|
||||||
|
M68*:*:R3V[567]*:*)
|
||||||
|
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
|
||||||
|
3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
|
||||||
|
OS_REL=''
|
||||||
|
test -r /etc/.relid \
|
||||||
|
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
||||||
|
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||||
|
&& echo i486-ncr-sysv4.3${OS_REL} && exit 0
|
||||||
|
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||||
|
&& echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
|
||||||
|
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
|
||||||
|
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||||
|
&& echo i486-ncr-sysv4 && exit 0 ;;
|
||||||
|
m68*:LynxOS:2.*:*)
|
||||||
|
echo m68k-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
mc68030:UNIX_System_V:4.*:*)
|
||||||
|
echo m68k-atari-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
i?86:LynxOS:2.*:*)
|
||||||
|
echo i386-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
TSUNAMI:LynxOS:2.*:*)
|
||||||
|
echo sparc-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
|
||||||
|
echo rs6000-unknown-lynxos${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
SM[BE]S:UNIX_SV:*:*)
|
||||||
|
echo mips-dde-sysv${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
RM*:SINIX-*:*:*)
|
||||||
|
echo mips-sni-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
*:SINIX-*:*:*)
|
||||||
|
if uname -p 2>/dev/null >/dev/null ; then
|
||||||
|
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||||
|
echo ${UNAME_MACHINE}-sni-sysv4
|
||||||
|
else
|
||||||
|
echo ns32k-sni-sysv
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||||
|
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||||
|
echo i586-unisys-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
*:UNIX_System_V:4*:FTX*)
|
||||||
|
# From Gerald Hewes <hewes@openmarket.com>.
|
||||||
|
# How about differentiating between stratus architectures? -djm
|
||||||
|
echo hppa1.1-stratus-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
*:*:*:FTX*)
|
||||||
|
# From seanf@swdc.stratus.com.
|
||||||
|
echo i860-stratus-sysv4
|
||||||
|
exit 0 ;;
|
||||||
|
mc68*:A/UX:*:*)
|
||||||
|
echo m68k-apple-aux${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
news*:NEWS-OS:*:6*)
|
||||||
|
echo mips-sony-newsos6
|
||||||
|
exit 0 ;;
|
||||||
|
R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*)
|
||||||
|
if [ -d /usr/nec ]; then
|
||||||
|
echo mips-nec-sysv${UNAME_RELEASE}
|
||||||
|
else
|
||||||
|
echo mips-unknown-sysv${UNAME_RELEASE}
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
|
||||||
|
echo powerpc-be-beos
|
||||||
|
exit 0 ;;
|
||||||
|
BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
|
||||||
|
echo powerpc-apple-beos
|
||||||
|
exit 0 ;;
|
||||||
|
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
|
||||||
|
echo i586-pc-beos
|
||||||
|
exit 0 ;;
|
||||||
|
SX-4:SUPER-UX:*:*)
|
||||||
|
echo sx4-nec-superux${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
SX-5:SUPER-UX:*:*)
|
||||||
|
echo sx5-nec-superux${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
Power*:Rhapsody:*:*)
|
||||||
|
echo powerpc-apple-rhapsody${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
*:Rhapsody:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#echo '(No uname command or uname output not recognized.)' 1>&2
|
||||||
|
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
|
||||||
|
|
||||||
|
cat >$dummy.c <<EOF
|
||||||
|
#ifdef _SEQUENT_
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/utsname.h>
|
||||||
|
#endif
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
#if defined (sony)
|
||||||
|
#if defined (MIPSEB)
|
||||||
|
/* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
|
||||||
|
I don't know.... */
|
||||||
|
printf ("mips-sony-bsd\n"); exit (0);
|
||||||
|
#else
|
||||||
|
#include <sys/param.h>
|
||||||
|
printf ("m68k-sony-newsos%s\n",
|
||||||
|
#ifdef NEWSOS4
|
||||||
|
"4"
|
||||||
|
#else
|
||||||
|
""
|
||||||
|
#endif
|
||||||
|
); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__arm) && defined (__acorn) && defined (__unix)
|
||||||
|
printf ("arm-acorn-riscix"); exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (hp300) && !defined (hpux)
|
||||||
|
printf ("m68k-hp-bsd\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (NeXT)
|
||||||
|
#if !defined (__ARCHITECTURE__)
|
||||||
|
#define __ARCHITECTURE__ "m68k"
|
||||||
|
#endif
|
||||||
|
int version;
|
||||||
|
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
|
||||||
|
if (version < 4)
|
||||||
|
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
|
||||||
|
else
|
||||||
|
printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
|
||||||
|
exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (MULTIMAX) || defined (n16)
|
||||||
|
#if defined (UMAXV)
|
||||||
|
printf ("ns32k-encore-sysv\n"); exit (0);
|
||||||
|
#else
|
||||||
|
#if defined (CMU)
|
||||||
|
printf ("ns32k-encore-mach\n"); exit (0);
|
||||||
|
#else
|
||||||
|
printf ("ns32k-encore-bsd\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__386BSD__)
|
||||||
|
printf ("i386-pc-bsd\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (sequent)
|
||||||
|
#if defined (i386)
|
||||||
|
printf ("i386-sequent-dynix\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
#if defined (ns32000)
|
||||||
|
printf ("ns32k-sequent-dynix\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (_SEQUENT_)
|
||||||
|
struct utsname un;
|
||||||
|
|
||||||
|
uname(&un);
|
||||||
|
|
||||||
|
if (strncmp(un.version, "V2", 2) == 0) {
|
||||||
|
printf ("i386-sequent-ptx2\n"); exit (0);
|
||||||
|
}
|
||||||
|
if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
|
||||||
|
printf ("i386-sequent-ptx1\n"); exit (0);
|
||||||
|
}
|
||||||
|
printf ("i386-sequent-ptx\n"); exit (0);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (vax)
|
||||||
|
#if !defined (ultrix)
|
||||||
|
printf ("vax-dec-bsd\n"); exit (0);
|
||||||
|
#else
|
||||||
|
printf ("vax-dec-ultrix\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (alliant) && defined (i860)
|
||||||
|
printf ("i860-alliant-bsd\n"); exit (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
|
||||||
|
rm -f $dummy.c $dummy
|
||||||
|
|
||||||
|
# Apollos put the system type in the environment.
|
||||||
|
|
||||||
|
test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
|
||||||
|
|
||||||
|
# Convex versions that predate uname can use getsysinfo(1)
|
||||||
|
|
||||||
|
if [ -x /usr/convex/getsysinfo ]
|
||||||
|
then
|
||||||
|
case `getsysinfo -f cpu_type` in
|
||||||
|
c1*)
|
||||||
|
echo c1-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
c2*)
|
||||||
|
if getsysinfo -f scalar_acc
|
||||||
|
then echo c32-convex-bsd
|
||||||
|
else echo c2-convex-bsd
|
||||||
|
fi
|
||||||
|
exit 0 ;;
|
||||||
|
c34*)
|
||||||
|
echo c34-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
c38*)
|
||||||
|
echo c38-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
c4*)
|
||||||
|
echo c4-convex-bsd
|
||||||
|
exit 0 ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
#echo '(Unable to guess system type)' 1>&2
|
||||||
|
|
||||||
|
exit 1
|
||||||
456
config.h.in
Normal file
456
config.h.in
Normal file
@@ -0,0 +1,456 @@
|
|||||||
|
/* config.h.in. Generated automatically from configure.in by autoheader. */
|
||||||
|
|
||||||
|
/* Define if using alloca.c. */
|
||||||
|
#undef C_ALLOCA
|
||||||
|
|
||||||
|
/* Define to empty if the keyword does not work. */
|
||||||
|
#undef const
|
||||||
|
|
||||||
|
/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
|
||||||
|
This function is required for alloca.c support on those systems. */
|
||||||
|
#undef CRAY_STACKSEG_END
|
||||||
|
|
||||||
|
/* Define to the type of elements in the array set by `getgroups'.
|
||||||
|
Usually this is either `int' or `gid_t'. */
|
||||||
|
#undef GETGROUPS_T
|
||||||
|
|
||||||
|
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||||
|
#undef gid_t
|
||||||
|
|
||||||
|
/* Define if you have alloca, as a function or macro. */
|
||||||
|
#undef HAVE_ALLOCA
|
||||||
|
|
||||||
|
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
|
||||||
|
#undef HAVE_ALLOCA_H
|
||||||
|
|
||||||
|
/* Define if you have a working `mmap' system call. */
|
||||||
|
#undef HAVE_MMAP
|
||||||
|
|
||||||
|
/* Define if your struct stat has st_rdev. */
|
||||||
|
#undef HAVE_ST_RDEV
|
||||||
|
|
||||||
|
/* Define if you have the strftime function. */
|
||||||
|
#undef HAVE_STRFTIME
|
||||||
|
|
||||||
|
/* Define if you have <sys/wait.h> that is POSIX.1 compatible. */
|
||||||
|
#undef HAVE_SYS_WAIT_H
|
||||||
|
|
||||||
|
/* Define if utime(file, NULL) sets file's timestamp to the present. */
|
||||||
|
#undef HAVE_UTIME_NULL
|
||||||
|
|
||||||
|
/* Define as __inline if that's what the C compiler calls it. */
|
||||||
|
#undef inline
|
||||||
|
|
||||||
|
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||||
|
#undef mode_t
|
||||||
|
|
||||||
|
/* Define to `long' if <sys/types.h> doesn't define. */
|
||||||
|
#undef off_t
|
||||||
|
|
||||||
|
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||||
|
#undef pid_t
|
||||||
|
|
||||||
|
/* Define if you need to in order for stat and other things to work. */
|
||||||
|
#undef _POSIX_SOURCE
|
||||||
|
|
||||||
|
/* Define as the return type of signal handlers (int or void). */
|
||||||
|
#undef RETSIGTYPE
|
||||||
|
|
||||||
|
/* Define if the `setpgrp' function takes no argument. */
|
||||||
|
#undef SETPGRP_VOID
|
||||||
|
|
||||||
|
/* Define to `unsigned' if <sys/types.h> doesn't define. */
|
||||||
|
#undef size_t
|
||||||
|
|
||||||
|
/* If using the C implementation of alloca, define if you know the
|
||||||
|
direction of stack growth for your system; otherwise it will be
|
||||||
|
automatically deduced at run-time.
|
||||||
|
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||||
|
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||||
|
STACK_DIRECTION = 0 => direction of growth unknown
|
||||||
|
*/
|
||||||
|
#undef STACK_DIRECTION
|
||||||
|
|
||||||
|
/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly. */
|
||||||
|
#undef STAT_MACROS_BROKEN
|
||||||
|
|
||||||
|
/* Define if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Define if you can safely include both <sys/time.h> and <time.h>. */
|
||||||
|
#undef TIME_WITH_SYS_TIME
|
||||||
|
|
||||||
|
/* Define if your <sys/time.h> declares struct tm. */
|
||||||
|
#undef TM_IN_SYS_TIME
|
||||||
|
|
||||||
|
/* Define to `int' if <sys/types.h> doesn't define. */
|
||||||
|
#undef uid_t
|
||||||
|
|
||||||
|
/* Define if you do not have <strings.h>, index, bzero, etc.. */
|
||||||
|
#undef USG
|
||||||
|
|
||||||
|
/* Define to enable password aging. */
|
||||||
|
#undef AGING
|
||||||
|
|
||||||
|
/* Define if struct passwd has pw_age. */
|
||||||
|
#undef ATT_AGE
|
||||||
|
|
||||||
|
/* Define if struct passwd has pw_comment. */
|
||||||
|
#undef ATT_COMMENT
|
||||||
|
|
||||||
|
/* Define if struct passwd has pw_quota. */
|
||||||
|
#undef BSD_QUOTA
|
||||||
|
|
||||||
|
/* Define if you have secure RPC. */
|
||||||
|
#undef DES_RPC
|
||||||
|
|
||||||
|
/* Define to 1 if NLS is requested. */
|
||||||
|
#undef ENABLE_NLS
|
||||||
|
|
||||||
|
/* Path for faillog file. */
|
||||||
|
#undef FAILLOG_FILE
|
||||||
|
|
||||||
|
/* Define to libshadow_getpass to use our own version of getpass(). */
|
||||||
|
#undef getpass
|
||||||
|
|
||||||
|
/* Define as 1 if you have catgets and don't want to use GNU gettext. */
|
||||||
|
#undef HAVE_CATGETS
|
||||||
|
|
||||||
|
/* Define as 1 if you have gettext and don't want to use GNU gettext. */
|
||||||
|
#undef HAVE_GETTEXT
|
||||||
|
|
||||||
|
/* Define if your locale.h file contains LC_MESSAGES. */
|
||||||
|
#undef HAVE_LC_MESSAGES
|
||||||
|
|
||||||
|
/* Defined if you have libcrack. */
|
||||||
|
#undef HAVE_LIBCRACK
|
||||||
|
|
||||||
|
/* Defined if you have the ts&szs cracklib. */
|
||||||
|
#undef HAVE_LIBCRACK_HIST
|
||||||
|
|
||||||
|
/* Defined if it includes *Pw functions. */
|
||||||
|
#undef HAVE_LIBCRACK_PW
|
||||||
|
|
||||||
|
/* Defined if you have libcrypt. */
|
||||||
|
#undef HAVE_LIBCRYPT
|
||||||
|
|
||||||
|
/* Define if struct lastlog has ll_host */
|
||||||
|
#undef HAVE_LL_HOST
|
||||||
|
|
||||||
|
/* Working shadow group support in libc? */
|
||||||
|
#undef HAVE_SHADOWGRP
|
||||||
|
|
||||||
|
/* Define to 1 if you have the stpcpy function. */
|
||||||
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
|
/* Define to support TCFS. */
|
||||||
|
#undef HAVE_TCFS
|
||||||
|
|
||||||
|
/* Path for lastlog file. */
|
||||||
|
#undef LASTLOG_FILE
|
||||||
|
|
||||||
|
/* Define to support /etc/login.access login access control. */
|
||||||
|
#undef LOGIN_ACCESS
|
||||||
|
|
||||||
|
/* Location of system mail spool directory. */
|
||||||
|
#undef MAIL_SPOOL_DIR
|
||||||
|
|
||||||
|
/* Name of user's mail spool file if stored in user's home directory. */
|
||||||
|
#undef MAIL_SPOOL_FILE
|
||||||
|
|
||||||
|
/* Define to support the MD5-based password hashing algorithm. */
|
||||||
|
#undef MD5_CRYPT
|
||||||
|
|
||||||
|
/* Define to enable the new readpass() that echoes asterisks. */
|
||||||
|
#undef NEW_READPASS
|
||||||
|
|
||||||
|
/* Define to support OPIE one-time password logins. */
|
||||||
|
#undef OPIE
|
||||||
|
|
||||||
|
/* Package name. */
|
||||||
|
#undef PACKAGE
|
||||||
|
|
||||||
|
/* Define if pam_strerror() needs two arguments (Linux-PAM 0.59). */
|
||||||
|
#undef PAM_STRERROR_NEEDS_TWO_ARGS
|
||||||
|
|
||||||
|
/* Path to passwd program. */
|
||||||
|
#undef PASSWD_PROGRAM
|
||||||
|
|
||||||
|
/* Define if the compiler understands function prototypes. */
|
||||||
|
#undef PROTOTYPES
|
||||||
|
|
||||||
|
/* Define if login should support the -r flag for rlogind. */
|
||||||
|
#undef RLOGIN
|
||||||
|
|
||||||
|
/* Define to the ruserok() "success" return value (0 or 1). */
|
||||||
|
#undef RUSEROK
|
||||||
|
|
||||||
|
/* Define to support the shadow group file. */
|
||||||
|
#undef SHADOWGRP
|
||||||
|
|
||||||
|
/* Define to support the shadow password file. */
|
||||||
|
#undef SHADOWPWD
|
||||||
|
|
||||||
|
/* Define to support S/Key logins. */
|
||||||
|
#undef SKEY
|
||||||
|
|
||||||
|
/* Define to support /etc/suauth su access control. */
|
||||||
|
#undef SU_ACCESS
|
||||||
|
|
||||||
|
/* Define if you want gdbm for TCFS. */
|
||||||
|
#undef TCFS_GDBM_SUPPORT
|
||||||
|
|
||||||
|
/* Define to support Pluggable Authentication Modules. */
|
||||||
|
#undef USE_PAM
|
||||||
|
|
||||||
|
/* Define to use syslog(). */
|
||||||
|
#undef USE_SYSLOG
|
||||||
|
|
||||||
|
/* Define if you have ut_host in struct utmp. */
|
||||||
|
#undef UT_HOST
|
||||||
|
|
||||||
|
/* Path for utmp file. */
|
||||||
|
#undef _UTMP_FILE
|
||||||
|
|
||||||
|
/* Define to ut_name if struct utmp has ut_name (not ut_user). */
|
||||||
|
#undef ut_user
|
||||||
|
|
||||||
|
/* Version. */
|
||||||
|
#undef VERSION
|
||||||
|
|
||||||
|
/* Path for wtmp file. */
|
||||||
|
#undef _WTMP_FILE
|
||||||
|
|
||||||
|
/* Define if you have the __argz_count function. */
|
||||||
|
#undef HAVE___ARGZ_COUNT
|
||||||
|
|
||||||
|
/* Define if you have the __argz_next function. */
|
||||||
|
#undef HAVE___ARGZ_NEXT
|
||||||
|
|
||||||
|
/* Define if you have the __argz_stringify function. */
|
||||||
|
#undef HAVE___ARGZ_STRINGIFY
|
||||||
|
|
||||||
|
/* Define if you have the a64l function. */
|
||||||
|
#undef HAVE_A64L
|
||||||
|
|
||||||
|
/* Define if you have the dcgettext function. */
|
||||||
|
#undef HAVE_DCGETTEXT
|
||||||
|
|
||||||
|
/* Define if you have the fchmod function. */
|
||||||
|
#undef HAVE_FCHMOD
|
||||||
|
|
||||||
|
/* Define if you have the fchown function. */
|
||||||
|
#undef HAVE_FCHOWN
|
||||||
|
|
||||||
|
/* Define if you have the fsync function. */
|
||||||
|
#undef HAVE_FSYNC
|
||||||
|
|
||||||
|
/* Define if you have the getcwd function. */
|
||||||
|
#undef HAVE_GETCWD
|
||||||
|
|
||||||
|
/* Define if you have the getgroups function. */
|
||||||
|
#undef HAVE_GETGROUPS
|
||||||
|
|
||||||
|
/* Define if you have the gethostname function. */
|
||||||
|
#undef HAVE_GETHOSTNAME
|
||||||
|
|
||||||
|
/* Define if you have the getpagesize function. */
|
||||||
|
#undef HAVE_GETPAGESIZE
|
||||||
|
|
||||||
|
/* Define if you have the getspnam function. */
|
||||||
|
#undef HAVE_GETSPNAM
|
||||||
|
|
||||||
|
/* Define if you have the gettimeofday function. */
|
||||||
|
#undef HAVE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
/* Define if you have the getusershell function. */
|
||||||
|
#undef HAVE_GETUSERSHELL
|
||||||
|
|
||||||
|
/* Define if you have the getutent function. */
|
||||||
|
#undef HAVE_GETUTENT
|
||||||
|
|
||||||
|
/* Define if you have the initgroups function. */
|
||||||
|
#undef HAVE_INITGROUPS
|
||||||
|
|
||||||
|
/* Define if you have the lckpwdf function. */
|
||||||
|
#undef HAVE_LCKPWDF
|
||||||
|
|
||||||
|
/* Define if you have the memcpy function. */
|
||||||
|
#undef HAVE_MEMCPY
|
||||||
|
|
||||||
|
/* Define if you have the memset function. */
|
||||||
|
#undef HAVE_MEMSET
|
||||||
|
|
||||||
|
/* Define if you have the mkdir function. */
|
||||||
|
#undef HAVE_MKDIR
|
||||||
|
|
||||||
|
/* Define if you have the munmap function. */
|
||||||
|
#undef HAVE_MUNMAP
|
||||||
|
|
||||||
|
/* Define if you have the putenv function. */
|
||||||
|
#undef HAVE_PUTENV
|
||||||
|
|
||||||
|
/* Define if you have the putgrent function. */
|
||||||
|
#undef HAVE_PUTGRENT
|
||||||
|
|
||||||
|
/* Define if you have the putpwent function. */
|
||||||
|
#undef HAVE_PUTPWENT
|
||||||
|
|
||||||
|
/* Define if you have the putspent function. */
|
||||||
|
#undef HAVE_PUTSPENT
|
||||||
|
|
||||||
|
/* Define if you have the rename function. */
|
||||||
|
#undef HAVE_RENAME
|
||||||
|
|
||||||
|
/* Define if you have the rmdir function. */
|
||||||
|
#undef HAVE_RMDIR
|
||||||
|
|
||||||
|
/* Define if you have the setenv function. */
|
||||||
|
#undef HAVE_SETENV
|
||||||
|
|
||||||
|
/* Define if you have the setgroups function. */
|
||||||
|
#undef HAVE_SETGROUPS
|
||||||
|
|
||||||
|
/* Define if you have the setlocale function. */
|
||||||
|
#undef HAVE_SETLOCALE
|
||||||
|
|
||||||
|
/* Define if you have the sgetgrent function. */
|
||||||
|
#undef HAVE_SGETGRENT
|
||||||
|
|
||||||
|
/* Define if you have the sgetpwent function. */
|
||||||
|
#undef HAVE_SGETPWENT
|
||||||
|
|
||||||
|
/* Define if you have the sgetspent function. */
|
||||||
|
#undef HAVE_SGETSPENT
|
||||||
|
|
||||||
|
/* Define if you have the sigaction function. */
|
||||||
|
#undef HAVE_SIGACTION
|
||||||
|
|
||||||
|
/* Define if you have the snprintf function. */
|
||||||
|
#undef HAVE_SNPRINTF
|
||||||
|
|
||||||
|
/* Define if you have the stpcpy function. */
|
||||||
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
|
/* Define if you have the strcasecmp function. */
|
||||||
|
#undef HAVE_STRCASECMP
|
||||||
|
|
||||||
|
/* Define if you have the strchr function. */
|
||||||
|
#undef HAVE_STRCHR
|
||||||
|
|
||||||
|
/* Define if you have the strdup function. */
|
||||||
|
#undef HAVE_STRDUP
|
||||||
|
|
||||||
|
/* Define if you have the strerror function. */
|
||||||
|
#undef HAVE_STRERROR
|
||||||
|
|
||||||
|
/* Define if you have the strstr function. */
|
||||||
|
#undef HAVE_STRSTR
|
||||||
|
|
||||||
|
/* Define if you have the updwtmp function. */
|
||||||
|
#undef HAVE_UPDWTMP
|
||||||
|
|
||||||
|
/* Define if you have the updwtmpx function. */
|
||||||
|
#undef HAVE_UPDWTMPX
|
||||||
|
|
||||||
|
/* Define if you have the <argz.h> header file. */
|
||||||
|
#undef HAVE_ARGZ_H
|
||||||
|
|
||||||
|
/* Define if you have the <dirent.h> header file. */
|
||||||
|
#undef HAVE_DIRENT_H
|
||||||
|
|
||||||
|
/* Define if you have the <fcntl.h> header file. */
|
||||||
|
#undef HAVE_FCNTL_H
|
||||||
|
|
||||||
|
/* Define if you have the <gshadow.h> header file. */
|
||||||
|
#undef HAVE_GSHADOW_H
|
||||||
|
|
||||||
|
/* Define if you have the <lastlog.h> header file. */
|
||||||
|
#undef HAVE_LASTLOG_H
|
||||||
|
|
||||||
|
/* Define if you have the <limits.h> header file. */
|
||||||
|
#undef HAVE_LIMITS_H
|
||||||
|
|
||||||
|
/* Define if you have the <locale.h> header file. */
|
||||||
|
#undef HAVE_LOCALE_H
|
||||||
|
|
||||||
|
/* Define if you have the <malloc.h> header file. */
|
||||||
|
#undef HAVE_MALLOC_H
|
||||||
|
|
||||||
|
/* Define if you have the <ndir.h> header file. */
|
||||||
|
#undef HAVE_NDIR_H
|
||||||
|
|
||||||
|
/* Define if you have the <nl_types.h> header file. */
|
||||||
|
#undef HAVE_NL_TYPES_H
|
||||||
|
|
||||||
|
/* Define if you have the <paths.h> header file. */
|
||||||
|
#undef HAVE_PATHS_H
|
||||||
|
|
||||||
|
/* Define if you have the <rpc/key_prot.h> header file. */
|
||||||
|
#undef HAVE_RPC_KEY_PROT_H
|
||||||
|
|
||||||
|
/* Define if you have the <sgtty.h> header file. */
|
||||||
|
#undef HAVE_SGTTY_H
|
||||||
|
|
||||||
|
/* Define if you have the <shadow.h> header file. */
|
||||||
|
#undef HAVE_SHADOW_H
|
||||||
|
|
||||||
|
/* Define if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/dir.h> header file. */
|
||||||
|
#undef HAVE_SYS_DIR_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/ioctl.h> header file. */
|
||||||
|
#undef HAVE_SYS_IOCTL_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/ndir.h> header file. */
|
||||||
|
#undef HAVE_SYS_NDIR_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/param.h> header file. */
|
||||||
|
#undef HAVE_SYS_PARAM_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/resource.h> header file. */
|
||||||
|
#undef HAVE_SYS_RESOURCE_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/time.h> header file. */
|
||||||
|
#undef HAVE_SYS_TIME_H
|
||||||
|
|
||||||
|
/* Define if you have the <syslog.h> header file. */
|
||||||
|
#undef HAVE_SYSLOG_H
|
||||||
|
|
||||||
|
/* Define if you have the <termio.h> header file. */
|
||||||
|
#undef HAVE_TERMIO_H
|
||||||
|
|
||||||
|
/* Define if you have the <termios.h> header file. */
|
||||||
|
#undef HAVE_TERMIOS_H
|
||||||
|
|
||||||
|
/* Define if you have the <ulimit.h> header file. */
|
||||||
|
#undef HAVE_ULIMIT_H
|
||||||
|
|
||||||
|
/* Define if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define if you have the <usersec.h> header file. */
|
||||||
|
#undef HAVE_USERSEC_H
|
||||||
|
|
||||||
|
/* Define if you have the <utime.h> header file. */
|
||||||
|
#undef HAVE_UTIME_H
|
||||||
|
|
||||||
|
/* Define if you have the <utmp.h> header file. */
|
||||||
|
#undef HAVE_UTMP_H
|
||||||
|
|
||||||
|
/* Define if you have the <utmpx.h> header file. */
|
||||||
|
#undef HAVE_UTMPX_H
|
||||||
|
|
||||||
|
/* Define if you have the i library (-li). */
|
||||||
|
#undef HAVE_LIBI
|
||||||
|
|
||||||
|
/* Define if you have the inet library (-linet). */
|
||||||
|
#undef HAVE_LIBINET
|
||||||
|
|
||||||
|
/* Define if you have the nsl library (-lnsl). */
|
||||||
|
#undef HAVE_LIBNSL
|
||||||
|
|
||||||
|
/* Define if you have the socket library (-lsocket). */
|
||||||
|
#undef HAVE_LIBSOCKET
|
||||||
965
config.sub
vendored
Executable file
965
config.sub
vendored
Executable file
@@ -0,0 +1,965 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Configuration validation subroutine script, version 1.1.
|
||||||
|
# Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
|
||||||
|
# This file is (in principle) common to ALL GNU software.
|
||||||
|
# The presence of a machine in this file suggests that SOME GNU software
|
||||||
|
# can handle that machine. It does not imply ALL GNU software can.
|
||||||
|
#
|
||||||
|
# This file is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
# Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||||
|
# Supply the specified configuration type as an argument.
|
||||||
|
# If it is invalid, we print an error message on stderr and exit with code 1.
|
||||||
|
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||||
|
|
||||||
|
# This file is supposed to be the same for all GNU packages
|
||||||
|
# and recognize all the CPU types, system types and aliases
|
||||||
|
# that are meaningful with *any* GNU software.
|
||||||
|
# Each package is responsible for reporting which valid configurations
|
||||||
|
# it does not support. The user should be able to distinguish
|
||||||
|
# a failure to support a valid configuration from a meaningless
|
||||||
|
# configuration.
|
||||||
|
|
||||||
|
# The goal of this file is to map all the various variations of a given
|
||||||
|
# machine specification into a single specification in the form:
|
||||||
|
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
||||||
|
# or in some cases, the newer four-part form:
|
||||||
|
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
||||||
|
# It is wrong to echo any other type of specification.
|
||||||
|
|
||||||
|
if [ x$1 = x ]
|
||||||
|
then
|
||||||
|
echo Configuration name missing. 1>&2
|
||||||
|
echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
|
||||||
|
echo "or $0 ALIAS" 1>&2
|
||||||
|
echo where ALIAS is a recognized configuration type. 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# First pass through any local machine types.
|
||||||
|
case $1 in
|
||||||
|
*local*)
|
||||||
|
echo $1
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
|
||||||
|
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||||
|
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||||
|
case $maybe_os in
|
||||||
|
linux-gnu*)
|
||||||
|
os=-$maybe_os
|
||||||
|
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||||
|
if [ $basic_machine != $1 ]
|
||||||
|
then os=`echo $1 | sed 's/.*-/-/'`
|
||||||
|
else os=; fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
### Let's recognize common machines as not being operating systems so
|
||||||
|
### that things like config.sub decstation-3100 work. We also
|
||||||
|
### recognize some manufacturers as not being operating systems, so we
|
||||||
|
### can provide default operating systems below.
|
||||||
|
case $os in
|
||||||
|
-sun*os*)
|
||||||
|
# Prevent following clause from handling this invalid input.
|
||||||
|
;;
|
||||||
|
-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
|
||||||
|
-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
|
||||||
|
-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
|
||||||
|
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||||
|
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||||
|
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||||
|
-apple)
|
||||||
|
os=
|
||||||
|
basic_machine=$1
|
||||||
|
;;
|
||||||
|
-hiux*)
|
||||||
|
os=-hiuxwe2
|
||||||
|
;;
|
||||||
|
-sco5)
|
||||||
|
os=sco3.2v5
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-sco4)
|
||||||
|
os=-sco3.2v4
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-sco3.2.[4-9]*)
|
||||||
|
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-sco3.2v[4-9]*)
|
||||||
|
# Don't forget version if it is 3.2v4 or newer.
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-sco*)
|
||||||
|
os=-sco3.2v2
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-isc)
|
||||||
|
os=-isc2.2
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-clix*)
|
||||||
|
basic_machine=clipper-intergraph
|
||||||
|
;;
|
||||||
|
-isc*)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
|
;;
|
||||||
|
-lynx*)
|
||||||
|
os=-lynxos
|
||||||
|
;;
|
||||||
|
-ptx*)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
|
||||||
|
;;
|
||||||
|
-windowsnt*)
|
||||||
|
os=`echo $os | sed -e 's/windowsnt/winnt/'`
|
||||||
|
;;
|
||||||
|
-psos*)
|
||||||
|
os=-psos
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Decode aliases for certain CPU-COMPANY combinations.
|
||||||
|
case $basic_machine in
|
||||||
|
# Recognize the basic CPU types without company name.
|
||||||
|
# Some are omitted here because they have special meanings below.
|
||||||
|
tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
|
||||||
|
| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
|
||||||
|
| 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 | hppa2.0 \
|
||||||
|
| alpha | alphaev5 | alphaev56 | alphapca56 | alphaev6 \
|
||||||
|
| alphapca57 | alphaev7 | we32k | ns16k | clipper \
|
||||||
|
| i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
|
||||||
|
| mips64 | mipsel | mips64el | mips64orion | mips64orionel \
|
||||||
|
| mipstx39 | mipstx39el | armv[34][lb] \
|
||||||
|
| sparc | sparclet | sparclite | sparc64 | v850)
|
||||||
|
basic_machine=$basic_machine-unknown
|
||||||
|
;;
|
||||||
|
# We use `pc' rather than `unknown'
|
||||||
|
# because (1) that's what they normally are, and
|
||||||
|
# (2) the word "unknown" tends to confuse beginning users.
|
||||||
|
i[34567]86)
|
||||||
|
basic_machine=$basic_machine-pc
|
||||||
|
;;
|
||||||
|
# Object if more than one company name word.
|
||||||
|
*-*-*)
|
||||||
|
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
# Recognize the basic CPU types with company name.
|
||||||
|
vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
|
||||||
|
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
|
||||||
|
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
|
||||||
|
| power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
|
||||||
|
| xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* \
|
||||||
|
| alpha-* | alphaev5-* | alphaev56-* | alphapca56-* \
|
||||||
|
| alphaev6-* | alphapca57-* | alphaev7-* | we32k-* | cydra-* \
|
||||||
|
| ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
|
||||||
|
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
|
||||||
|
| sparc64-* | mips64-* | mipsel-* | armv[34][lb]-* \
|
||||||
|
| mips64el-* | mips64orion-* | mips64orionel-* \
|
||||||
|
| mipstx39-* | mipstx39el-* \
|
||||||
|
| f301-* | armv*-*)
|
||||||
|
;;
|
||||||
|
# Recognize the various machine names and aliases which stand
|
||||||
|
# for a CPU type and a company and sometimes even an OS.
|
||||||
|
3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
|
||||||
|
basic_machine=m68000-att
|
||||||
|
;;
|
||||||
|
3b*)
|
||||||
|
basic_machine=we32k-att
|
||||||
|
;;
|
||||||
|
alliant | fx80)
|
||||||
|
basic_machine=fx80-alliant
|
||||||
|
;;
|
||||||
|
altos | altos3068)
|
||||||
|
basic_machine=m68k-altos
|
||||||
|
;;
|
||||||
|
am29k)
|
||||||
|
basic_machine=a29k-none
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
amdahl)
|
||||||
|
basic_machine=580-amdahl
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
amiga | amiga-*)
|
||||||
|
basic_machine=m68k-cbm
|
||||||
|
;;
|
||||||
|
amigaos | amigados)
|
||||||
|
basic_machine=m68k-cbm
|
||||||
|
os=-amigaos
|
||||||
|
;;
|
||||||
|
amigaunix | amix)
|
||||||
|
basic_machine=m68k-cbm
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
apollo68)
|
||||||
|
basic_machine=m68k-apollo
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
aux)
|
||||||
|
basic_machine=m68k-apple
|
||||||
|
os=-aux
|
||||||
|
;;
|
||||||
|
balance)
|
||||||
|
basic_machine=ns32k-sequent
|
||||||
|
os=-dynix
|
||||||
|
;;
|
||||||
|
convex-c1)
|
||||||
|
basic_machine=c1-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
convex-c2)
|
||||||
|
basic_machine=c2-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
convex-c32)
|
||||||
|
basic_machine=c32-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
convex-c34)
|
||||||
|
basic_machine=c34-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
convex-c38)
|
||||||
|
basic_machine=c38-convex
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
cray | ymp)
|
||||||
|
basic_machine=ymp-cray
|
||||||
|
os=-unicos
|
||||||
|
;;
|
||||||
|
cray2)
|
||||||
|
basic_machine=cray2-cray
|
||||||
|
os=-unicos
|
||||||
|
;;
|
||||||
|
[ctj]90-cray)
|
||||||
|
basic_machine=c90-cray
|
||||||
|
os=-unicos
|
||||||
|
;;
|
||||||
|
crds | unos)
|
||||||
|
basic_machine=m68k-crds
|
||||||
|
;;
|
||||||
|
da30 | da30-*)
|
||||||
|
basic_machine=m68k-da30
|
||||||
|
;;
|
||||||
|
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
|
||||||
|
basic_machine=mips-dec
|
||||||
|
;;
|
||||||
|
delta | 3300 | motorola-3300 | motorola-delta \
|
||||||
|
| 3300-motorola | delta-motorola)
|
||||||
|
basic_machine=m68k-motorola
|
||||||
|
;;
|
||||||
|
delta88)
|
||||||
|
basic_machine=m88k-motorola
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
dpx20 | dpx20-*)
|
||||||
|
basic_machine=rs6000-bull
|
||||||
|
os=-bosx
|
||||||
|
;;
|
||||||
|
dpx2* | dpx2*-bull)
|
||||||
|
basic_machine=m68k-bull
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
ebmon29k)
|
||||||
|
basic_machine=a29k-amd
|
||||||
|
os=-ebmon
|
||||||
|
;;
|
||||||
|
elxsi)
|
||||||
|
basic_machine=elxsi-elxsi
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
encore | umax | mmax)
|
||||||
|
basic_machine=ns32k-encore
|
||||||
|
;;
|
||||||
|
fx2800)
|
||||||
|
basic_machine=i860-alliant
|
||||||
|
;;
|
||||||
|
genix)
|
||||||
|
basic_machine=ns32k-ns
|
||||||
|
;;
|
||||||
|
gmicro)
|
||||||
|
basic_machine=tron-gmicro
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
h3050r* | hiux*)
|
||||||
|
basic_machine=hppa1.1-hitachi
|
||||||
|
os=-hiuxwe2
|
||||||
|
;;
|
||||||
|
h8300hms)
|
||||||
|
basic_machine=h8300-hitachi
|
||||||
|
os=-hms
|
||||||
|
;;
|
||||||
|
harris)
|
||||||
|
basic_machine=m88k-harris
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
hp300-*)
|
||||||
|
basic_machine=m68k-hp
|
||||||
|
;;
|
||||||
|
hp300bsd)
|
||||||
|
basic_machine=m68k-hp
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
hp300hpux)
|
||||||
|
basic_machine=m68k-hp
|
||||||
|
os=-hpux
|
||||||
|
;;
|
||||||
|
hp9k2[0-9][0-9] | hp9k31[0-9])
|
||||||
|
basic_machine=m68000-hp
|
||||||
|
;;
|
||||||
|
hp9k3[2-9][0-9])
|
||||||
|
basic_machine=m68k-hp
|
||||||
|
;;
|
||||||
|
hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
|
||||||
|
basic_machine=hppa1.1-hp
|
||||||
|
;;
|
||||||
|
hp9k8[0-9][0-9] | hp8[0-9][0-9])
|
||||||
|
basic_machine=hppa1.0-hp
|
||||||
|
;;
|
||||||
|
hppa-next)
|
||||||
|
os=-nextstep3
|
||||||
|
;;
|
||||||
|
i370-ibm* | ibm*)
|
||||||
|
basic_machine=i370-ibm
|
||||||
|
os=-mvs
|
||||||
|
;;
|
||||||
|
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||||
|
i[34567]86v32)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
|
os=-sysv32
|
||||||
|
;;
|
||||||
|
i[34567]86v4*)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
i[34567]86v)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
i[34567]86sol2)
|
||||||
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
|
os=-solaris2
|
||||||
|
;;
|
||||||
|
iris | iris4d)
|
||||||
|
basic_machine=mips-sgi
|
||||||
|
case $os in
|
||||||
|
-irix*)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
os=-irix4
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
isi68 | isi)
|
||||||
|
basic_machine=m68k-isi
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
m88k-omron*)
|
||||||
|
basic_machine=m88k-omron
|
||||||
|
;;
|
||||||
|
magnum | m3230)
|
||||||
|
basic_machine=mips-mips
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
merlin)
|
||||||
|
basic_machine=ns32k-utek
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
miniframe)
|
||||||
|
basic_machine=m68000-convergent
|
||||||
|
;;
|
||||||
|
mipsel*-linux*)
|
||||||
|
basic_machine=mipsel-unknown
|
||||||
|
os=-linux-gnu
|
||||||
|
;;
|
||||||
|
mips*-linux*)
|
||||||
|
basic_machine=mips-unknown
|
||||||
|
os=-linux-gnu
|
||||||
|
;;
|
||||||
|
mips3*-*)
|
||||||
|
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
|
||||||
|
;;
|
||||||
|
mips3*)
|
||||||
|
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
|
||||||
|
;;
|
||||||
|
ncr3000)
|
||||||
|
basic_machine=i486-ncr
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
netwinder)
|
||||||
|
basic_machine=armv4l-corel
|
||||||
|
os=-linux
|
||||||
|
;;
|
||||||
|
news | news700 | news800 | news900)
|
||||||
|
basic_machine=m68k-sony
|
||||||
|
os=-newsos
|
||||||
|
;;
|
||||||
|
news1000)
|
||||||
|
basic_machine=m68030-sony
|
||||||
|
os=-newsos
|
||||||
|
;;
|
||||||
|
news-3600 | risc-news)
|
||||||
|
basic_machine=mips-sony
|
||||||
|
os=-newsos
|
||||||
|
;;
|
||||||
|
next | m*-next )
|
||||||
|
basic_machine=m68k-next
|
||||||
|
case $os in
|
||||||
|
-nextstep* )
|
||||||
|
;;
|
||||||
|
-ns2*)
|
||||||
|
os=-nextstep2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
os=-nextstep3
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
nh3000)
|
||||||
|
basic_machine=m68k-harris
|
||||||
|
os=-cxux
|
||||||
|
;;
|
||||||
|
nh[45]000)
|
||||||
|
basic_machine=m88k-harris
|
||||||
|
os=-cxux
|
||||||
|
;;
|
||||||
|
nindy960)
|
||||||
|
basic_machine=i960-intel
|
||||||
|
os=-nindy
|
||||||
|
;;
|
||||||
|
np1)
|
||||||
|
basic_machine=np1-gould
|
||||||
|
;;
|
||||||
|
pa-hitachi)
|
||||||
|
basic_machine=hppa1.1-hitachi
|
||||||
|
os=-hiuxwe2
|
||||||
|
;;
|
||||||
|
paragon)
|
||||||
|
basic_machine=i860-intel
|
||||||
|
os=-osf
|
||||||
|
;;
|
||||||
|
pbd)
|
||||||
|
basic_machine=sparc-tti
|
||||||
|
;;
|
||||||
|
pbb)
|
||||||
|
basic_machine=m68k-tti
|
||||||
|
;;
|
||||||
|
pc532 | pc532-*)
|
||||||
|
basic_machine=ns32k-pc532
|
||||||
|
;;
|
||||||
|
pentium | p5 | k5 | nexen)
|
||||||
|
basic_machine=i586-pc
|
||||||
|
;;
|
||||||
|
pentiumpro | p6 | k6 | 6x86)
|
||||||
|
basic_machine=i686-pc
|
||||||
|
;;
|
||||||
|
pentiumii | pentium2)
|
||||||
|
basic_machine=i786-pc
|
||||||
|
;;
|
||||||
|
pentium-* | p5-* | k5-* | nexen-*)
|
||||||
|
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
pentiumpro-* | p6-* | k6-* | 6x86-*)
|
||||||
|
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
pentiumii-* | pentium2-*)
|
||||||
|
basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
pn)
|
||||||
|
basic_machine=pn-gould
|
||||||
|
;;
|
||||||
|
power) basic_machine=rs6000-ibm
|
||||||
|
;;
|
||||||
|
ppc) basic_machine=powerpc-unknown
|
||||||
|
;;
|
||||||
|
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||||
|
basic_machine=powerpcle-unknown
|
||||||
|
;;
|
||||||
|
ppcle-* | powerpclittle-*)
|
||||||
|
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
|
ps2)
|
||||||
|
basic_machine=i386-ibm
|
||||||
|
;;
|
||||||
|
rm[46]00)
|
||||||
|
basic_machine=mips-siemens
|
||||||
|
;;
|
||||||
|
rtpc | rtpc-*)
|
||||||
|
basic_machine=romp-ibm
|
||||||
|
;;
|
||||||
|
sequent)
|
||||||
|
basic_machine=i386-sequent
|
||||||
|
;;
|
||||||
|
sh)
|
||||||
|
basic_machine=sh-hitachi
|
||||||
|
os=-hms
|
||||||
|
;;
|
||||||
|
sps7)
|
||||||
|
basic_machine=m68k-bull
|
||||||
|
os=-sysv2
|
||||||
|
;;
|
||||||
|
spur)
|
||||||
|
basic_machine=spur-unknown
|
||||||
|
;;
|
||||||
|
sun2)
|
||||||
|
basic_machine=m68000-sun
|
||||||
|
;;
|
||||||
|
sun2os3)
|
||||||
|
basic_machine=m68000-sun
|
||||||
|
os=-sunos3
|
||||||
|
;;
|
||||||
|
sun2os4)
|
||||||
|
basic_machine=m68000-sun
|
||||||
|
os=-sunos4
|
||||||
|
;;
|
||||||
|
sun3os3)
|
||||||
|
basic_machine=m68k-sun
|
||||||
|
os=-sunos3
|
||||||
|
;;
|
||||||
|
sun3os4)
|
||||||
|
basic_machine=m68k-sun
|
||||||
|
os=-sunos4
|
||||||
|
;;
|
||||||
|
sun4os3)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
os=-sunos3
|
||||||
|
;;
|
||||||
|
sun4os4)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
os=-sunos4
|
||||||
|
;;
|
||||||
|
sun4sol2)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
os=-solaris2
|
||||||
|
;;
|
||||||
|
sun3 | sun3-*)
|
||||||
|
basic_machine=m68k-sun
|
||||||
|
;;
|
||||||
|
sun4)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
;;
|
||||||
|
sun386 | sun386i | roadrunner)
|
||||||
|
basic_machine=i386-sun
|
||||||
|
;;
|
||||||
|
symmetry)
|
||||||
|
basic_machine=i386-sequent
|
||||||
|
os=-dynix
|
||||||
|
;;
|
||||||
|
tx39)
|
||||||
|
basic_machine=mipstx39-unknown
|
||||||
|
;;
|
||||||
|
tx39el)
|
||||||
|
basic_machine=mipstx39el-unknown
|
||||||
|
;;
|
||||||
|
tower | tower-32)
|
||||||
|
basic_machine=m68k-ncr
|
||||||
|
;;
|
||||||
|
udi29k)
|
||||||
|
basic_machine=a29k-amd
|
||||||
|
os=-udi
|
||||||
|
;;
|
||||||
|
ultra3)
|
||||||
|
basic_machine=a29k-nyu
|
||||||
|
os=-sym1
|
||||||
|
;;
|
||||||
|
vaxv)
|
||||||
|
basic_machine=vax-dec
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
vms)
|
||||||
|
basic_machine=vax-dec
|
||||||
|
os=-vms
|
||||||
|
;;
|
||||||
|
vpp*|vx|vx-*)
|
||||||
|
basic_machine=f301-fujitsu
|
||||||
|
;;
|
||||||
|
vxworks960)
|
||||||
|
basic_machine=i960-wrs
|
||||||
|
os=-vxworks
|
||||||
|
;;
|
||||||
|
vxworks68)
|
||||||
|
basic_machine=m68k-wrs
|
||||||
|
os=-vxworks
|
||||||
|
;;
|
||||||
|
vxworks29k)
|
||||||
|
basic_machine=a29k-wrs
|
||||||
|
os=-vxworks
|
||||||
|
;;
|
||||||
|
xmp)
|
||||||
|
basic_machine=xmp-cray
|
||||||
|
os=-unicos
|
||||||
|
;;
|
||||||
|
xps | xps100)
|
||||||
|
basic_machine=xps100-honeywell
|
||||||
|
;;
|
||||||
|
none)
|
||||||
|
basic_machine=none-none
|
||||||
|
os=-none
|
||||||
|
;;
|
||||||
|
|
||||||
|
# Here we handle the default manufacturer of certain CPU types. It is in
|
||||||
|
# some cases the only manufacturer, in others, it is the most popular.
|
||||||
|
mips)
|
||||||
|
if [ x$os = x-linux-gnu ]; then
|
||||||
|
basic_machine=mips-unknown
|
||||||
|
else
|
||||||
|
basic_machine=mips-mips
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
romp)
|
||||||
|
basic_machine=romp-ibm
|
||||||
|
;;
|
||||||
|
rs6000)
|
||||||
|
basic_machine=rs6000-ibm
|
||||||
|
;;
|
||||||
|
vax)
|
||||||
|
basic_machine=vax-dec
|
||||||
|
;;
|
||||||
|
pdp11)
|
||||||
|
basic_machine=pdp11-dec
|
||||||
|
;;
|
||||||
|
we32k)
|
||||||
|
basic_machine=we32k-att
|
||||||
|
;;
|
||||||
|
sparc)
|
||||||
|
basic_machine=sparc-sun
|
||||||
|
;;
|
||||||
|
cydra)
|
||||||
|
basic_machine=cydra-cydrome
|
||||||
|
;;
|
||||||
|
orion)
|
||||||
|
basic_machine=orion-highlevel
|
||||||
|
;;
|
||||||
|
orion105)
|
||||||
|
basic_machine=clipper-highlevel
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Here we canonicalize certain aliases for manufacturers.
|
||||||
|
case $basic_machine in
|
||||||
|
*-digital*)
|
||||||
|
basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
|
||||||
|
;;
|
||||||
|
*-commodore*)
|
||||||
|
basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Decode manufacturer-specific aliases for certain operating systems.
|
||||||
|
|
||||||
|
if [ x"$os" != x"" ]
|
||||||
|
then
|
||||||
|
case $os in
|
||||||
|
# First match some system type aliases
|
||||||
|
# that might get confused with valid system types.
|
||||||
|
# -solaris* is a basic system type, with this one exception.
|
||||||
|
-solaris1 | -solaris1.*)
|
||||||
|
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||||
|
;;
|
||||||
|
-solaris)
|
||||||
|
os=-solaris2
|
||||||
|
;;
|
||||||
|
-svr4*)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
-unixware*)
|
||||||
|
os=-sysv4.2uw
|
||||||
|
;;
|
||||||
|
-gnu/linux*)
|
||||||
|
os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
|
||||||
|
;;
|
||||||
|
# First accept the basic system types.
|
||||||
|
# The portable systems comes first.
|
||||||
|
# Each alternative MUST END IN A *, to match a version number.
|
||||||
|
# -sysv* is not here because it comes later, after sysvr4.
|
||||||
|
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||||
|
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
||||||
|
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||||
|
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||||
|
| -aos* \
|
||||||
|
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||||
|
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||||
|
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
|
||||||
|
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
|
||||||
|
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||||
|
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||||
|
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||||
|
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -rhapsody* \
|
||||||
|
| -openstep*)
|
||||||
|
# Remember, each alternative MUST END IN *, to match a version number.
|
||||||
|
;;
|
||||||
|
-linux*)
|
||||||
|
os=`echo $os | sed -e 's|linux|linux-gnu|'`
|
||||||
|
;;
|
||||||
|
-sunos5*)
|
||||||
|
os=`echo $os | sed -e 's|sunos5|solaris2|'`
|
||||||
|
;;
|
||||||
|
-sunos6*)
|
||||||
|
os=`echo $os | sed -e 's|sunos6|solaris3|'`
|
||||||
|
;;
|
||||||
|
-osfrose*)
|
||||||
|
os=-osfrose
|
||||||
|
;;
|
||||||
|
-osf*)
|
||||||
|
os=-osf
|
||||||
|
;;
|
||||||
|
-utek*)
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
-dynix*)
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
-acis*)
|
||||||
|
os=-aos
|
||||||
|
;;
|
||||||
|
-ctix* | -uts*)
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
-ns2 )
|
||||||
|
os=-nextstep2
|
||||||
|
;;
|
||||||
|
# Preserve the version number of sinix5.
|
||||||
|
-sinix5.*)
|
||||||
|
os=`echo $os | sed -e 's|sinix|sysv|'`
|
||||||
|
;;
|
||||||
|
-sinix*)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
-triton*)
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
-oss*)
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
-svr4)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
-svr3)
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
-sysvr4)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
# This must come after -sysvr4.
|
||||||
|
-sysv*)
|
||||||
|
;;
|
||||||
|
-xenix)
|
||||||
|
os=-xenix
|
||||||
|
;;
|
||||||
|
-none)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Get rid of the `-' at the beginning of $os.
|
||||||
|
os=`echo $os | sed 's/[^-]*-//'`
|
||||||
|
echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
|
||||||
|
# Here we handle the default operating systems that come with various machines.
|
||||||
|
# The value should be what the vendor currently ships out the door with their
|
||||||
|
# machine or put another way, the most popular os provided with the machine.
|
||||||
|
|
||||||
|
# Note that if you're going to try to match "-MANUFACTURER" here (say,
|
||||||
|
# "-sun"), then you have to tell the case statement up towards the top
|
||||||
|
# that MANUFACTURER isn't an operating system. Otherwise, code above
|
||||||
|
# will signal an error saying that MANUFACTURER isn't an operating
|
||||||
|
# system, and we'll never get to this point.
|
||||||
|
|
||||||
|
case $basic_machine in
|
||||||
|
*-acorn)
|
||||||
|
os=-riscix1.2
|
||||||
|
;;
|
||||||
|
arm*-corel)
|
||||||
|
os=-linux
|
||||||
|
;;
|
||||||
|
arm*-semi)
|
||||||
|
os=-aout
|
||||||
|
;;
|
||||||
|
pdp11-*)
|
||||||
|
os=-none
|
||||||
|
;;
|
||||||
|
*-dec | vax-*)
|
||||||
|
os=-ultrix4.2
|
||||||
|
;;
|
||||||
|
m68*-apollo)
|
||||||
|
os=-domain
|
||||||
|
;;
|
||||||
|
i386-sun)
|
||||||
|
os=-sunos4.0.2
|
||||||
|
;;
|
||||||
|
m68000-sun)
|
||||||
|
os=-sunos3
|
||||||
|
# This also exists in the configure program, but was not the
|
||||||
|
# default.
|
||||||
|
# os=-sunos4
|
||||||
|
;;
|
||||||
|
*-tti) # must be before sparc entry or we get the wrong os.
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
sparc-* | *-sun)
|
||||||
|
os=-sunos4.1.1
|
||||||
|
;;
|
||||||
|
*-be)
|
||||||
|
os=-beos
|
||||||
|
;;
|
||||||
|
*-ibm)
|
||||||
|
os=-aix
|
||||||
|
;;
|
||||||
|
*-hp)
|
||||||
|
os=-hpux
|
||||||
|
;;
|
||||||
|
*-hitachi)
|
||||||
|
os=-hiux
|
||||||
|
;;
|
||||||
|
i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
*-cbm)
|
||||||
|
os=-amigaos
|
||||||
|
;;
|
||||||
|
*-dg)
|
||||||
|
os=-dgux
|
||||||
|
;;
|
||||||
|
*-dolphin)
|
||||||
|
os=-sysv3
|
||||||
|
;;
|
||||||
|
m68k-ccur)
|
||||||
|
os=-rtu
|
||||||
|
;;
|
||||||
|
m88k-omron*)
|
||||||
|
os=-luna
|
||||||
|
;;
|
||||||
|
*-next )
|
||||||
|
os=-nextstep
|
||||||
|
;;
|
||||||
|
*-sequent)
|
||||||
|
os=-ptx
|
||||||
|
;;
|
||||||
|
*-crds)
|
||||||
|
os=-unos
|
||||||
|
;;
|
||||||
|
*-ns)
|
||||||
|
os=-genix
|
||||||
|
;;
|
||||||
|
i370-*)
|
||||||
|
os=-mvs
|
||||||
|
;;
|
||||||
|
*-next)
|
||||||
|
os=-nextstep3
|
||||||
|
;;
|
||||||
|
*-gould)
|
||||||
|
os=-sysv
|
||||||
|
;;
|
||||||
|
*-highlevel)
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
*-encore)
|
||||||
|
os=-bsd
|
||||||
|
;;
|
||||||
|
*-sgi)
|
||||||
|
os=-irix
|
||||||
|
;;
|
||||||
|
*-siemens)
|
||||||
|
os=-sysv4
|
||||||
|
;;
|
||||||
|
*-masscomp)
|
||||||
|
os=-rtu
|
||||||
|
;;
|
||||||
|
f301-fujitsu)
|
||||||
|
os=-uxpv
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
os=-none
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Here we handle the case where we know the os, and the CPU type, but not the
|
||||||
|
# manufacturer. We pick the logical manufacturer.
|
||||||
|
vendor=unknown
|
||||||
|
case $basic_machine in
|
||||||
|
*-unknown)
|
||||||
|
case $os in
|
||||||
|
-riscix*)
|
||||||
|
vendor=acorn
|
||||||
|
;;
|
||||||
|
-sunos*)
|
||||||
|
vendor=sun
|
||||||
|
;;
|
||||||
|
-aix*)
|
||||||
|
vendor=ibm
|
||||||
|
;;
|
||||||
|
-hpux*)
|
||||||
|
vendor=hp
|
||||||
|
;;
|
||||||
|
-hiux*)
|
||||||
|
vendor=hitachi
|
||||||
|
;;
|
||||||
|
-unos*)
|
||||||
|
vendor=crds
|
||||||
|
;;
|
||||||
|
-dgux*)
|
||||||
|
vendor=dg
|
||||||
|
;;
|
||||||
|
-luna*)
|
||||||
|
vendor=omron
|
||||||
|
;;
|
||||||
|
-genix*)
|
||||||
|
vendor=ns
|
||||||
|
;;
|
||||||
|
-mvs*)
|
||||||
|
vendor=ibm
|
||||||
|
;;
|
||||||
|
-ptx*)
|
||||||
|
vendor=sequent
|
||||||
|
;;
|
||||||
|
-vxsim* | -vxworks*)
|
||||||
|
vendor=wrs
|
||||||
|
;;
|
||||||
|
-aux*)
|
||||||
|
vendor=apple
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo $basic_machine$os
|
||||||
313
configure.in
Normal file
313
configure.in
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
AC_INIT(lib/dialchk.c)
|
||||||
|
AM_INIT_AUTOMAKE(shadow, 19990709)
|
||||||
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
|
dnl Some hacks...
|
||||||
|
test "$prefix" = "NONE" && prefix="/usr"
|
||||||
|
test "$prefix" = "/usr" && exec_prefix=""
|
||||||
|
test "$CFLAGS" = "" && CFLAGS="-O2 -Wall"
|
||||||
|
test "$LDFLAGS" = "" && LDFLAGS="-s"
|
||||||
|
|
||||||
|
ALL_LINGUAS="el pl"
|
||||||
|
|
||||||
|
dnl Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_ISC_POSIX
|
||||||
|
dnl AC_PROG_INSTALL
|
||||||
|
AC_PROG_LN_S
|
||||||
|
dnl AC_PROG_MAKE_SET
|
||||||
|
AC_PROG_YACC
|
||||||
|
dnl AC_ARG_PROGRAM
|
||||||
|
AM_C_PROTOTYPES
|
||||||
|
AM_PROG_LIBTOOL
|
||||||
|
|
||||||
|
dnl Checks for libraries.
|
||||||
|
|
||||||
|
dnl Checks for header files.
|
||||||
|
AC_HEADER_DIRENT
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_HEADER_SYS_WAIT
|
||||||
|
AC_CHECK_HEADERS(fcntl.h limits.h unistd.h sys/time.h utmp.h utmpx.h)
|
||||||
|
AC_CHECK_HEADERS(termios.h termio.h sgtty.h sys/ioctl.h syslog.h)
|
||||||
|
AC_CHECK_HEADERS(paths.h usersec.h utime.h ulimit.h sys/resource.h)
|
||||||
|
AC_CHECK_HEADERS(gshadow.h shadow.h lastlog.h rpc/key_prot.h)
|
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_C_CONST
|
||||||
|
AC_TYPE_UID_T
|
||||||
|
AC_TYPE_OFF_T
|
||||||
|
AC_TYPE_PID_T
|
||||||
|
AC_TYPE_MODE_T
|
||||||
|
AC_STRUCT_ST_RDEV
|
||||||
|
AC_HEADER_STAT
|
||||||
|
AC_HEADER_TIME
|
||||||
|
AC_STRUCT_TM
|
||||||
|
|
||||||
|
AC_CACHE_CHECK(for pw_age in struct passwd,
|
||||||
|
ac_cv_struct_passwd_pw_age, AC_TRY_COMPILE([#include <pwd.h>],
|
||||||
|
[ struct passwd pw; pw.pw_age = ""; ],
|
||||||
|
ac_cv_struct_passwd_pw_age=yes, ac_cv_struct_passwd_pw_age=no))
|
||||||
|
|
||||||
|
if test "$ac_cv_struct_passwd_pw_age" = "yes"; then
|
||||||
|
AC_DEFINE(ATT_AGE)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CACHE_CHECK(for pw_comment in struct passwd,
|
||||||
|
ac_cv_struct_passwd_pw_comment, AC_TRY_COMPILE([#include <pwd.h>],
|
||||||
|
[ struct passwd pw; pw.pw_comment = ""; ],
|
||||||
|
ac_cv_struct_passwd_pw_comment=yes, ac_cv_struct_passwd_pw_comment=no))
|
||||||
|
|
||||||
|
if test "$ac_cv_struct_passwd_pw_comment" = "yes"; then
|
||||||
|
AC_DEFINE(ATT_COMMENT)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CACHE_CHECK(for pw_quota in struct passwd,
|
||||||
|
ac_cv_struct_passwd_pw_quota, AC_TRY_COMPILE([#include <pwd.h>],
|
||||||
|
[ struct passwd pw; pw.pw_quota = ""; ],
|
||||||
|
ac_cv_struct_passwd_pw_quota=yes, ac_cv_struct_passwd_pw_quota=no))
|
||||||
|
|
||||||
|
if test "$ac_cv_struct_passwd_pw_quota" = "yes"; then
|
||||||
|
AC_DEFINE(BSD_QUOTA)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$ac_cv_header_utmp_h" = "yes"; then
|
||||||
|
AC_CACHE_CHECK(for ut_host in struct utmp,
|
||||||
|
ac_cv_struct_utmp_ut_host, AC_TRY_COMPILE([#include <utmp.h>],
|
||||||
|
[ struct utmp ut; char *cp = ut.ut_host; ],
|
||||||
|
ac_cv_struct_utmp_ut_host=yes, ac_cv_struct_utmp_ut_host=no))
|
||||||
|
|
||||||
|
if test "$ac_cv_struct_utmp_ut_host" = "yes"; then
|
||||||
|
AC_DEFINE(UT_HOST)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CACHE_CHECK(for ut_user in struct utmp,
|
||||||
|
ac_cv_struct_utmp_ut_user, AC_TRY_COMPILE([#include <utmp.h>],
|
||||||
|
[ struct utmp ut; char *cp = ut.ut_user; ],
|
||||||
|
ac_cv_struct_utmp_ut_user=yes, ac_cv_struct_utmp_ut_user=no))
|
||||||
|
|
||||||
|
if test "$ac_cv_struct_utmp_ut_user" = "no"; then
|
||||||
|
AC_DEFINE(ut_user, ut_name)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
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_TRY_COMPILE([#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)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Checks for library functions.
|
||||||
|
AC_TYPE_GETGROUPS
|
||||||
|
AC_PROG_GCC_TRADITIONAL
|
||||||
|
AC_TYPE_SIGNAL
|
||||||
|
AC_FUNC_UTIME_NULL
|
||||||
|
AC_FUNC_STRFTIME
|
||||||
|
dnl Disabled for now, strtoday.c has problems with year 2000 or later
|
||||||
|
dnl AC_CHECK_FUNCS(strptime)
|
||||||
|
AC_CHECK_FUNCS(a64l fchmod fchown fsync getgroups gethostname getspnam)
|
||||||
|
AC_CHECK_FUNCS(gettimeofday getusershell getutent initgroups lckpwdf)
|
||||||
|
AC_CHECK_FUNCS(memcpy memset setgroups sigaction strchr updwtmp updwtmpx)
|
||||||
|
|
||||||
|
AC_REPLACE_FUNCS(mkdir putgrent putpwent putspent rename rmdir)
|
||||||
|
AC_REPLACE_FUNCS(sgetgrent sgetpwent sgetspent)
|
||||||
|
AC_REPLACE_FUNCS(snprintf strcasecmp strdup strerror strstr)
|
||||||
|
|
||||||
|
AC_CHECK_FUNC(setpgrp)
|
||||||
|
AC_FUNC_SETPGRP
|
||||||
|
|
||||||
|
if test "$ac_cv_header_shadow_h" = "yes"; then
|
||||||
|
AC_CACHE_CHECK(for working shadow group support,
|
||||||
|
ac_cv_libc_shadowgrp, AC_TRY_RUN(
|
||||||
|
[
|
||||||
|
#include <shadow.h>
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
struct sgrp *sg = sgetsgent("test:x::");
|
||||||
|
/* NYS libc on Red Hat 3.0.3 has broken shadow group support */
|
||||||
|
return !sg || !sg->sg_adm || !sg->sg_mem;
|
||||||
|
}
|
||||||
|
],
|
||||||
|
ac_cv_libc_shadowgrp=yes,ac_cv_libc_shadowgrp=no,ac_cv_libc_shadowgrp=no))
|
||||||
|
|
||||||
|
if test "$ac_cv_libc_shadowgrp" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_SHADOWGRP)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(location of shared mail directory)
|
||||||
|
for maildir in /var/spool/mail /var/mail /usr/spool/mail /usr/mail NONE; do
|
||||||
|
if test "$maildir" = "NONE"; then
|
||||||
|
AC_MSG_RESULT(None)
|
||||||
|
elif test -d $maildir; then
|
||||||
|
AC_DEFINE_UNQUOTED(MAIL_SPOOL_DIR, "$maildir")
|
||||||
|
AC_MSG_RESULT($maildir)
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(location of user mail file)
|
||||||
|
for mailfile in Mailbox mailbox Mail mail .mail NONE; do
|
||||||
|
if test "$mailfile" = "NONE"; then
|
||||||
|
AC_MSG_RESULT(None)
|
||||||
|
elif test -f $HOME/$mailfile; then
|
||||||
|
AC_DEFINE_UNQUOTED(MAIL_SPOOL_FILE, "$mailfile")
|
||||||
|
AC_MSG_RESULT($mailfile)
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(location of utmp)
|
||||||
|
for utmpdir in /var/run /var/adm /usr/adm /etc NONE; do
|
||||||
|
if test "$utmpdir" = "NONE"; then
|
||||||
|
AC_MSG_WARN(utmp file not found)
|
||||||
|
elif test -f $utmpdir/utmp; then
|
||||||
|
AC_DEFINE_UNQUOTED(_UTMP_FILE, "$utmpdir/utmp")
|
||||||
|
AC_MSG_RESULT($utmpdir)
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(location of faillog/lastlog/wtmp)
|
||||||
|
for logdir in /var/log /var/adm /usr/adm /etc; do
|
||||||
|
if test -d $logdir; then
|
||||||
|
AC_DEFINE_UNQUOTED(_WTMP_FILE, "$logdir/wtmp")
|
||||||
|
AC_DEFINE_UNQUOTED(LASTLOG_FILE, "$logdir/lastlog")
|
||||||
|
AC_DEFINE_UNQUOTED(FAILLOG_FILE, "$logdir/faillog")
|
||||||
|
AC_MSG_RESULT($logdir)
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(location of the passwd program)
|
||||||
|
if test -f /usr/bin/passwd; then
|
||||||
|
passwd_dir=/usr/bin
|
||||||
|
else
|
||||||
|
passwd_dir=/bin
|
||||||
|
fi
|
||||||
|
AC_DEFINE_UNQUOTED(PASSWD_PROGRAM, "$passwd_dir/passwd")
|
||||||
|
AC_MSG_RESULT($passwd_dir)
|
||||||
|
|
||||||
|
dnl XXX - quick hack, should disappear before anyone notices :).
|
||||||
|
AC_DEFINE(SHADOWPWD)
|
||||||
|
AC_DEFINE(USG)
|
||||||
|
AC_DEFINE(AGING)
|
||||||
|
AC_DEFINE(USE_SYSLOG)
|
||||||
|
AC_DEFINE(RLOGIN)
|
||||||
|
AC_DEFINE(RUSEROK, 0)
|
||||||
|
AC_DEFINE(LOGIN_ACCESS)
|
||||||
|
AC_DEFINE(SU_ACCESS)
|
||||||
|
|
||||||
|
dnl Use our own version of getpass(), which handles long passwords
|
||||||
|
dnl (unlike many systems which have a limit of 8 characters), and can
|
||||||
|
dnl be interrupted with Ctrl-C (unlike Linux libc).
|
||||||
|
AC_DEFINE(getpass, libshadow_getpass)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(desrpc, [ --enable-desrpc try to use secure RPC in login (default if found)])
|
||||||
|
dnl AC_ARG_ENABLE(md5crypt, [ --enable-md5crypt include MD5-compatible crypt function])
|
||||||
|
AC_ARG_ENABLE(readpass, [ --enable-readpass include code to enter passwords that echoes asterisks])
|
||||||
|
AC_ARG_ENABLE(shadowgrp, [ --enable-shadowgrp enable shadow group support [default=yes]])
|
||||||
|
|
||||||
|
AC_ARG_WITH(libcrack, [ --with-libcrack try to use libcrack (default if found)])
|
||||||
|
AC_ARG_WITH(libcrypt, [ --with-libcrypt try to use libcrypt (default if found)])
|
||||||
|
AC_ARG_WITH(libopie, [ --with-libopie use libopie for OPIE support])
|
||||||
|
AC_ARG_WITH(libpam, [ --with-libpam use libpam for PAM support])
|
||||||
|
AC_ARG_WITH(libskey, [ --with-libskey use libskey for S/Key support])
|
||||||
|
AC_ARG_WITH(libtcfs, [ --with-libtcfs use libtcfs for TCFS support])
|
||||||
|
|
||||||
|
dnl Check for some functions in libc first, only if not found check for
|
||||||
|
dnl other libraries. This should prevent linking libnsl if not really
|
||||||
|
dnl needed (Linux glibc, Irix), but still link it if needed (Solaris).
|
||||||
|
|
||||||
|
AC_CHECK_FUNC(inet_ntoa, [], AC_CHECK_LIB(inet, inet_ntoa))
|
||||||
|
AC_CHECK_FUNC(socket, [], AC_CHECK_LIB(socket, socket))
|
||||||
|
AC_CHECK_FUNC(gethostbyname, [], AC_CHECK_LIB(nsl, gethostbyname))
|
||||||
|
|
||||||
|
dnl XXX - getsecretkey() causes login to hang for 5 minutes on at least
|
||||||
|
dnl one RH 4.0 system. Use --disable-desrpc if you have this problem.
|
||||||
|
dnl Reported by Mohan Khurana <mohan@stealth.net>.
|
||||||
|
|
||||||
|
if test "$enable_desrpc" != "no" -a "$ac_cv_header_rpc_key_prot_h" = "yes" ; then
|
||||||
|
AC_CHECK_FUNC(getsecretkey, AC_DEFINE(DES_RPC),
|
||||||
|
AC_CHECK_LIB(rpcsvc, getsecretkey, AC_DEFINE(DES_RPC)))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$enable_readpass" = "yes" ; then
|
||||||
|
AC_DEFINE(NEW_READPASS)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$enable_shadowgrp" != "no"; then
|
||||||
|
AC_DEFINE(SHADOWGRP)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(LIBCRYPT)
|
||||||
|
if test "$with_libcrypt" != "no"; then
|
||||||
|
AC_CHECK_LIB(crypt, crypt, [AC_DEFINE(HAVE_LIBCRYPT) LIBCRYPT=-lcrypt])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$enable_md5crypt" = "yes"; then
|
||||||
|
LIBOBJS="$LIBOBJS md5.o md5crypt.o"
|
||||||
|
AC_DEFINE(MD5_CRYPT)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(LIBCRACK)
|
||||||
|
if test "$with_libcrack" != "no"; then
|
||||||
|
echo "checking cracklib flavour, don't be surprised by the results"
|
||||||
|
AC_CHECK_LIB(crack, FascistCheck, AC_DEFINE(HAVE_LIBCRACK) LIBCRACK=-lcrack)
|
||||||
|
AC_CHECK_LIB(crack, FascistHistory, AC_DEFINE(HAVE_LIBCRACK_HIST))
|
||||||
|
AC_CHECK_LIB(crack, FascistHistoryPw, AC_DEFINE(HAVE_LIBCRACK_PW))
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(LIBSKEY)
|
||||||
|
if test "$with_libskey" = "yes"; then
|
||||||
|
AC_CHECK_LIB(skey, skeychallenge, AC_DEFINE(SKEY) LIBSKEY=-lskey, , $LIBCRYPT)
|
||||||
|
elif test "$with_libopie" = "yes"; then
|
||||||
|
AC_CHECK_LIB(opie, opiechallenge, AC_DEFINE(OPIE) LIBSKEY=-lopie, , $LIBCRYPT)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(LIBTCFS)
|
||||||
|
if test "$with_libtcfs" = "yes"; then
|
||||||
|
AC_CHECK_LIB(tcfs, tcfs_encrypt_key, AC_DEFINE(HAVE_TCFS) AC_DEFINE(TCFS_GDBM_SUPPORT) LIBTCFS="-ltcfs -lgdbm", , -lgdbm)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(LIBPAM)
|
||||||
|
if test "$with_libpam" = "yes"; then
|
||||||
|
dnl AC_CHECK_LIB(pam, pam_start, AC_DEFINE(USE_PAM) LIBPAM=-lpam)
|
||||||
|
dnl the above doesn't work as there is no libpam.a (only .so)
|
||||||
|
dnl XXX - libpam_misc is probably Linux-PAM specific
|
||||||
|
LIBPAM="-lpam -lpam_misc -ldl"
|
||||||
|
AC_DEFINE(USE_PAM)
|
||||||
|
AC_CACHE_CHECK(whether pam_strerror needs two arguments,
|
||||||
|
ac_cv_pam_strerror_needs_two_args,
|
||||||
|
AC_TRY_COMPILE(
|
||||||
|
[#include <security/pam_appl.h>],
|
||||||
|
[ pam_handle_t *pamh; pam_strerror(pamh, PAM_SUCCESS); ],
|
||||||
|
ac_cv_pam_strerror_needs_two_args=yes,
|
||||||
|
ac_cv_pam_strerror_needs_two_args=no
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if test "$ac_cv_pam_strerror_needs_two_args" = "yes"; then
|
||||||
|
AC_DEFINE(PAM_STRERROR_NEEDS_TWO_ARGS)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
LTLIBOBJS=`echo "$LIBOBJS" | sed 's/\.o/.lo/g'`
|
||||||
|
AC_SUBST(LTLIBOBJS)
|
||||||
|
dnl LTALLOCA=`echo "$ALLOCA" | sed 's/\.o/.lo/g'`
|
||||||
|
dnl AC_SUBST(LTALLOCA)
|
||||||
|
|
||||||
|
AM_GNU_GETTEXT
|
||||||
|
dnl AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
|
||||||
|
|
||||||
|
AC_OUTPUT(libmisc/Makefile man/Makefile lib/Makefile src/Makefile Makefile
|
||||||
|
contrib/Makefile debian/Makefile doc/Makefile etc/Makefile
|
||||||
|
intl/Makefile intl/po2tbl.sed po/Makefile.in
|
||||||
|
etc/pam.d/Makefile old/Makefile
|
||||||
|
redhat/Makefile redhat/shadow-utils.spec,
|
||||||
|
echo timestamp > stamp-h)
|
||||||
|
|
||||||
5
contrib/Makefile.am
Normal file
5
contrib/Makefile.am
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
EXTRA_DIST = README adduser.c adduser-old.c adduser.sh adduser2.sh \
|
||||||
|
atudel pwdauth.c rpasswd.c shadow-anonftp.patch udbachk.v012.tgz
|
||||||
196
contrib/Makefile.in
Normal file
196
contrib/Makefile.in
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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.
|
||||||
|
|
||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
DISTDIR =
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = ..
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CATALOGS = @CATALOGS@
|
||||||
|
CATOBJEXT = @CATOBJEXT@
|
||||||
|
CC = @CC@
|
||||||
|
CPP = @CPP@
|
||||||
|
DATADIRNAME = @DATADIRNAME@
|
||||||
|
GENCAT = @GENCAT@
|
||||||
|
GMOFILES = @GMOFILES@
|
||||||
|
GMSGFMT = @GMSGFMT@
|
||||||
|
GT_NO = @GT_NO@
|
||||||
|
GT_YES = @GT_YES@
|
||||||
|
INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
|
||||||
|
INSTOBJEXT = @INSTOBJEXT@
|
||||||
|
INTLDEPS = @INTLDEPS@
|
||||||
|
INTLLIBS = @INTLLIBS@
|
||||||
|
INTLOBJS = @INTLOBJS@
|
||||||
|
LD = @LD@
|
||||||
|
LIBCRACK = @LIBCRACK@
|
||||||
|
LIBCRYPT = @LIBCRYPT@
|
||||||
|
LIBPAM = @LIBPAM@
|
||||||
|
LIBSKEY = @LIBSKEY@
|
||||||
|
LIBTCFS = @LIBTCFS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
|
MSGFMT = @MSGFMT@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
POFILES = @POFILES@
|
||||||
|
POSUB = @POSUB@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
U = @U@
|
||||||
|
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
||||||
|
USE_NLS = @USE_NLS@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
YACC = @YACC@
|
||||||
|
l = @l@
|
||||||
|
|
||||||
|
EXTRA_DIST = README adduser.c adduser-old.c adduser.sh adduser2.sh \
|
||||||
|
atudel pwdauth.c rpasswd.c shadow-anonftp.patch udbachk.v012.tgz
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = ../config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
DIST_COMMON = README Makefile.am Makefile.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
all: Makefile
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps contrib/Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
|
|
||||||
|
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
|
||||||
|
subdir = contrib
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
info:
|
||||||
|
dvi:
|
||||||
|
check: all
|
||||||
|
$(MAKE)
|
||||||
|
installcheck:
|
||||||
|
install-exec:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-exec install-data all
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs:
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean: mostlyclean-generic
|
||||||
|
|
||||||
|
clean: clean-generic mostlyclean
|
||||||
|
|
||||||
|
distclean: distclean-generic clean
|
||||||
|
-rm -f config.status
|
||||||
|
-rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-generic distclean
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
.PHONY: tags distdir info dvi installcheck install-exec install-data \
|
||||||
|
install uninstall all installdirs mostlyclean-generic distclean-generic \
|
||||||
|
clean-generic maintainer-clean-generic clean mostlyclean distclean \
|
||||||
|
maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
10
contrib/README
Normal file
10
contrib/README
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
People keep sending various adduser programs and scripts... They are
|
||||||
|
all in this directory. I haven't tested them, use at your own risk.
|
||||||
|
Anyway, the best one I've seen so far is adduser-3.x from Debian.
|
||||||
|
|
||||||
|
atudel is a perl script to remove at jobs owned by the specified user
|
||||||
|
(atrm in at-2.9 for Linux can't do that).
|
||||||
|
|
||||||
|
udbachk.tgz is a passwd/group/shadow file integrity checker.
|
||||||
|
|
||||||
|
--marekm
|
||||||
300
contrib/adduser-old.c
Normal file
300
contrib/adduser-old.c
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
/****
|
||||||
|
** 03/17/96
|
||||||
|
** hacked a bit more, removed unused code, cleaned up for gcc -Wall.
|
||||||
|
** --marekm
|
||||||
|
**
|
||||||
|
** 02/26/96
|
||||||
|
** modified to call shadow utils (useradd,chage,passwd) on shadowed
|
||||||
|
** systems - Cristian Gafton, gafton@sorosis.ro
|
||||||
|
**
|
||||||
|
** 6/27/95
|
||||||
|
** shadow-adduser 1.4:
|
||||||
|
**
|
||||||
|
** now it copies the /etc/skel dir into the person's dir,
|
||||||
|
** makes the mail folders, changed some defaults and made a 'make
|
||||||
|
** install' just for the hell of it.
|
||||||
|
**
|
||||||
|
** Greg Gallagher
|
||||||
|
** CIN.Net
|
||||||
|
**
|
||||||
|
** 1/28/95
|
||||||
|
** shadow-adduser 1.3:
|
||||||
|
**
|
||||||
|
** Basically a bug-fix on my additions in 1.2. Thanx to Terry Stewart
|
||||||
|
** (stew@texas.net) for pointing out one of the many idiotic bugs I introduced.
|
||||||
|
** It was such a stupid bug that I would have never seen it myself.
|
||||||
|
**
|
||||||
|
** Brandon
|
||||||
|
*****
|
||||||
|
** 01/27/95
|
||||||
|
**
|
||||||
|
** shadow-adduser 1.2:
|
||||||
|
** I took the C source from adduser-shadow (credits are below) and made
|
||||||
|
** it a little more worthwhile. Many small changes... Here's
|
||||||
|
** the ones I can remember:
|
||||||
|
**
|
||||||
|
** Removed support for non-shadowed systems (if you don't have shadow,
|
||||||
|
** use the original adduser, don't get this shadow version!)
|
||||||
|
** Added support for the correct /etc/shadow fields (Min days before
|
||||||
|
** password change, max days before password change, Warning days,
|
||||||
|
** and how many days from expiry date does the account go invalid)
|
||||||
|
** The previous version just left all of those fields blank.
|
||||||
|
** There is still one field left (expiry date for the account, period)
|
||||||
|
** which I have left blank because I do not use it and didn't want to
|
||||||
|
** spend any more time on this. I'm sure someone will put it in and
|
||||||
|
** tack another plethora of credits on here. :)
|
||||||
|
** Added in the password date field, which should always reflect the last
|
||||||
|
** date the password was changed, for expiry purposes. "passwd" always
|
||||||
|
** updates this field, so the adduser program should set it up right
|
||||||
|
** initially (or a user could keep thier initial password forever ;)
|
||||||
|
** The number is in days since Jan 1st, 1970.
|
||||||
|
**
|
||||||
|
** Have fun with it, and someone please make
|
||||||
|
** a real version(this is still just a hack)
|
||||||
|
** for us all to use (and Email it to me???)
|
||||||
|
**
|
||||||
|
** Brandon
|
||||||
|
** photon@usis.com
|
||||||
|
**
|
||||||
|
*****
|
||||||
|
** adduser 1.0: add a new user account (For systems not using shadow)
|
||||||
|
** With a nice little interface and a will to do all the work for you.
|
||||||
|
**
|
||||||
|
** Craig Hagan
|
||||||
|
** hagan@opine.cs.umass.edu
|
||||||
|
**
|
||||||
|
** Modified to really work, look clean, and find unused uid by Chris Cappuccio
|
||||||
|
** chris@slinky.cs.umass.edu
|
||||||
|
**
|
||||||
|
*****
|
||||||
|
**
|
||||||
|
** 01/19/95
|
||||||
|
**
|
||||||
|
** FURTHER modifications to enable shadow passwd support (kludged, but
|
||||||
|
** no more so than the original) by Dan Crowson - dcrowson@mo.net
|
||||||
|
**
|
||||||
|
** Search on DAN for all changes...
|
||||||
|
**
|
||||||
|
*****
|
||||||
|
**
|
||||||
|
** cc -O -o adduser adduser.c
|
||||||
|
** Use gcc if you have it... (political reasons beyond my control) (chris)
|
||||||
|
**
|
||||||
|
** I've gotten this program to work with success under Linux (without
|
||||||
|
** shadow) and SunOS 4.1.3. I would assume it should work pretty well
|
||||||
|
** on any system that uses no shadow. (chris)
|
||||||
|
**
|
||||||
|
** If you have no crypt() then try
|
||||||
|
** cc -DNO_CRYPT -O -o adduser adduser.c xfdes.c
|
||||||
|
** I'm not sure how login operates with no crypt()... I guess
|
||||||
|
** the same way we're doing it here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/timeb.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#define DEFAULT_SHELL "/bin/bash" /* because BASH is your friend */
|
||||||
|
#define DEFAULT_HOME "/home"
|
||||||
|
#define USERADD_PATH "/usr/sbin/useradd"
|
||||||
|
#define CHAGE_PATH "/usr/sbin/chage"
|
||||||
|
#define PASSWD_PATH "/usr/bin/passwd"
|
||||||
|
#define DEFAULT_GROUP 100
|
||||||
|
|
||||||
|
#define DEFAULT_MAX_PASS 60
|
||||||
|
#define DEFAULT_WARN_PASS 10
|
||||||
|
/* if you use this feature, you will get a lot of complaints from users
|
||||||
|
who rarely use their accounts :) (something like 3 months would be
|
||||||
|
more reasonable) --marekm */
|
||||||
|
#define DEFAULT_USER_DIE /* 10 */ 0
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
char foo[32];
|
||||||
|
char uname[9],person[32],dir[32],shell[32];
|
||||||
|
unsigned int group,min_pass,max_pass,warn_pass,user_die;
|
||||||
|
/* the group and uid of the new user */
|
||||||
|
int bad=0,done=0,correct=0,gets_warning=0;
|
||||||
|
char cmd[255];
|
||||||
|
struct group *grp;
|
||||||
|
|
||||||
|
/* flags, in order:
|
||||||
|
* bad to see if the username is in /etc/passwd, or if strange stuff has
|
||||||
|
* been typed if the user might be put in group 0
|
||||||
|
* done allows the program to exit when a user has been added
|
||||||
|
* correct loops until a password is found that isn't in /etc/passwd
|
||||||
|
* gets_warning allows the fflush to be skipped for the first gets
|
||||||
|
* so that output is still legible
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The real program starts HERE! */
|
||||||
|
|
||||||
|
if(geteuid()!=0)
|
||||||
|
{
|
||||||
|
printf("It seems you don't have access to add a new user. Try\n");
|
||||||
|
printf("logging in as root or su root to gain super-user access.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanity checks
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!(grp=getgrgid(DEFAULT_GROUP))){
|
||||||
|
printf("Error: the default group %d does not exist on this system!\n",
|
||||||
|
DEFAULT_GROUP);
|
||||||
|
printf("adduser must be recompiled.\n");
|
||||||
|
exit(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
while(!correct) { /* loop until a "good" uname is chosen */
|
||||||
|
while(!done) {
|
||||||
|
printf("\nLogin to add (^C to quit): ");
|
||||||
|
if(gets_warning) /* if the warning was already shown */
|
||||||
|
fflush(stdout); /* fflush stdout, otherwise set the flag */
|
||||||
|
else
|
||||||
|
gets_warning=1;
|
||||||
|
|
||||||
|
gets(uname);
|
||||||
|
if(!strlen(uname)) {
|
||||||
|
printf("Empty input.\n");
|
||||||
|
done=0;
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* what I saw here before made me think maybe I was running DOS */
|
||||||
|
/* might this be a solution? (chris) */
|
||||||
|
if (getpwnam(uname) != NULL) {
|
||||||
|
printf("That name is in use, choose another.\n");
|
||||||
|
done=0;
|
||||||
|
} else
|
||||||
|
done=1;
|
||||||
|
}; /* done, we have a valid new user name */
|
||||||
|
|
||||||
|
/* all set, get the rest of the stuff */
|
||||||
|
printf("\nEditing information for new user [%s]\n",uname);
|
||||||
|
|
||||||
|
printf("\nFull Name [%s]: ",uname);
|
||||||
|
gets(person);
|
||||||
|
if (!strlen(person)) {
|
||||||
|
bzero(person,sizeof(person));
|
||||||
|
strcpy(person,uname);
|
||||||
|
};
|
||||||
|
|
||||||
|
do {
|
||||||
|
bad=0;
|
||||||
|
printf("GID [%d]: ",DEFAULT_GROUP);
|
||||||
|
gets(foo);
|
||||||
|
if (!strlen(foo))
|
||||||
|
group=DEFAULT_GROUP;
|
||||||
|
else
|
||||||
|
if (isdigit (*foo)) {
|
||||||
|
group = atoi(foo);
|
||||||
|
if (! (grp = getgrgid (group))) {
|
||||||
|
printf("unknown gid %s\n",foo);
|
||||||
|
group=DEFAULT_GROUP;
|
||||||
|
bad=1;
|
||||||
|
};
|
||||||
|
} else
|
||||||
|
if ((grp = getgrnam (foo)))
|
||||||
|
group = grp->gr_gid;
|
||||||
|
else {
|
||||||
|
printf("unknown group %s\n",foo);
|
||||||
|
group=DEFAULT_GROUP;
|
||||||
|
bad=1;
|
||||||
|
}
|
||||||
|
if (group==0){ /* You're not allowed to make root group users! */
|
||||||
|
printf("Creation of root group users not allowed (must be done by hand)\n");
|
||||||
|
group=DEFAULT_GROUP;
|
||||||
|
bad=1;
|
||||||
|
};
|
||||||
|
} while(bad);
|
||||||
|
|
||||||
|
|
||||||
|
fflush(stdin);
|
||||||
|
|
||||||
|
printf("\nIf home dir ends with a / then [%s] will be appended to it\n",uname);
|
||||||
|
printf("Home Directory [%s/%s]: ",DEFAULT_HOME,uname);
|
||||||
|
fflush(stdout);
|
||||||
|
gets(dir);
|
||||||
|
if (!strlen(dir)) { /* hit return */
|
||||||
|
sprintf(dir,"%s/%s",DEFAULT_HOME,uname);
|
||||||
|
fflush(stdin);
|
||||||
|
} else
|
||||||
|
if (dir[strlen(dir)-1]=='/')
|
||||||
|
sprintf(dir,"%s%s",dir,uname);
|
||||||
|
|
||||||
|
printf("\nShell [%s]: ",DEFAULT_SHELL);
|
||||||
|
fflush(stdout);
|
||||||
|
gets(shell);
|
||||||
|
if (!strlen(shell))
|
||||||
|
sprintf(shell,"%s",DEFAULT_SHELL);
|
||||||
|
|
||||||
|
printf("\nMin. Password Change Days [0]: ");
|
||||||
|
gets(foo);
|
||||||
|
min_pass=atoi(foo);
|
||||||
|
|
||||||
|
printf("Max. Password Change Days [%d]: ",DEFAULT_MAX_PASS);
|
||||||
|
gets(foo);
|
||||||
|
if (strlen(foo) > 1)
|
||||||
|
max_pass = atoi(foo);
|
||||||
|
else
|
||||||
|
max_pass = DEFAULT_MAX_PASS;
|
||||||
|
|
||||||
|
printf("Password Warning Days [%d]: ",DEFAULT_WARN_PASS);
|
||||||
|
gets(foo);
|
||||||
|
warn_pass = atoi(foo);
|
||||||
|
if (warn_pass==0)
|
||||||
|
warn_pass = DEFAULT_WARN_PASS;
|
||||||
|
|
||||||
|
printf("Days after Password Expiry for Account Locking [%d]: ",DEFAULT_USER_DIE);
|
||||||
|
gets(foo);
|
||||||
|
user_die = atoi(foo);
|
||||||
|
if (user_die == 0)
|
||||||
|
user_die = DEFAULT_USER_DIE;
|
||||||
|
|
||||||
|
printf("\nInformation for new user [%s] [%s]:\n",uname,person);
|
||||||
|
printf("Home directory: [%s] Shell: [%s]\n",dir,shell);
|
||||||
|
printf("GID: [%d]\n",group);
|
||||||
|
printf("MinPass: [%d] MaxPass: [%d] WarnPass: [%d] UserExpire: [%d]\n",
|
||||||
|
min_pass,max_pass,warn_pass,user_die);
|
||||||
|
printf("\nIs this correct? [y/N]: ");
|
||||||
|
fflush(stdout);
|
||||||
|
gets(foo);
|
||||||
|
|
||||||
|
done=bad=correct=(foo[0]=='y'||foo[0]=='Y');
|
||||||
|
|
||||||
|
if(bad!=1)
|
||||||
|
printf("\nUser [%s] not added\n",uname);
|
||||||
|
}
|
||||||
|
|
||||||
|
bzero(cmd,sizeof(cmd));
|
||||||
|
sprintf(cmd,"%s -g %d -d %s -s %s -c \"%s\" -m -k /etc/skel %s",
|
||||||
|
USERADD_PATH,group,dir,shell,person,uname);
|
||||||
|
printf("Calling useradd to add new user:\n%s\n",cmd);
|
||||||
|
if(system(cmd)){
|
||||||
|
printf("User add failed!\n");
|
||||||
|
exit(errno);
|
||||||
|
};
|
||||||
|
bzero(cmd,sizeof(cmd));
|
||||||
|
sprintf(cmd,"%s -m %d -M %d -W %d -I %d %s", CHAGE_PATH,
|
||||||
|
min_pass,max_pass,warn_pass,user_die,uname);
|
||||||
|
printf("%s\n",cmd);
|
||||||
|
if(system(cmd)){
|
||||||
|
printf("There was an error setting password expire values\n");
|
||||||
|
exit(errno);
|
||||||
|
};
|
||||||
|
bzero(cmd,sizeof(cmd));
|
||||||
|
sprintf(cmd,"%s %s",PASSWD_PATH,uname);
|
||||||
|
system(cmd);
|
||||||
|
printf("\nDone.\n");
|
||||||
|
}
|
||||||
|
|
||||||
502
contrib/adduser.c
Normal file
502
contrib/adduser.c
Normal file
@@ -0,0 +1,502 @@
|
|||||||
|
/****
|
||||||
|
** 04/21/96
|
||||||
|
** hacked even more, replaced gets() with something slightly harder to buffer
|
||||||
|
** overflow. Added support for setting a default quota on new account, with
|
||||||
|
** edquota -p. Other cleanups for security, I let some users run adduser suid
|
||||||
|
** root to add new accounts. (overflow checks, clobber environment, valid
|
||||||
|
** shell checks, restrictions on gid + home dir settings).
|
||||||
|
|
||||||
|
** Added max. username length. Used syslog() a bit for important events.
|
||||||
|
** Support to immediately expire account with passwd -e.
|
||||||
|
|
||||||
|
** Called it version 2.0! Because I felt like it!
|
||||||
|
|
||||||
|
** -- Chris, chris@ferret.lmh.ox.ac.uk
|
||||||
|
|
||||||
|
** 03/17/96
|
||||||
|
** hacked a bit more, removed unused code, cleaned up for gcc -Wall.
|
||||||
|
** --marekm
|
||||||
|
**
|
||||||
|
** 02/26/96
|
||||||
|
** modified to call shadow utils (useradd,chage,passwd) on shadowed
|
||||||
|
** systems - Cristian Gafton, gafton@sorosis.ro
|
||||||
|
**
|
||||||
|
** 6/27/95
|
||||||
|
** shadow-adduser 1.4:
|
||||||
|
**
|
||||||
|
** now it copies the /etc/skel dir into the person's dir,
|
||||||
|
** makes the mail folders, changed some defaults and made a 'make
|
||||||
|
** install' just for the hell of it.
|
||||||
|
**
|
||||||
|
** Greg Gallagher
|
||||||
|
** CIN.Net
|
||||||
|
**
|
||||||
|
** 1/28/95
|
||||||
|
** shadow-adduser 1.3:
|
||||||
|
**
|
||||||
|
** Basically a bug-fix on my additions in 1.2. Thanx to Terry Stewart
|
||||||
|
** (stew@texas.net) for pointing out one of the many idiotic bugs I introduced.
|
||||||
|
** It was such a stupid bug that I would have never seen it myself.
|
||||||
|
**
|
||||||
|
** Brandon
|
||||||
|
*****
|
||||||
|
** 01/27/95
|
||||||
|
**
|
||||||
|
** shadow-adduser 1.2:
|
||||||
|
** I took the C source from adduser-shadow (credits are below) and made
|
||||||
|
** it a little more worthwhile. Many small changes... Here's
|
||||||
|
** the ones I can remember:
|
||||||
|
**
|
||||||
|
** Removed support for non-shadowed systems (if you don't have shadow,
|
||||||
|
** use the original adduser, don't get this shadow version!)
|
||||||
|
** Added support for the correct /etc/shadow fields (Min days before
|
||||||
|
** password change, max days before password change, Warning days,
|
||||||
|
** and how many days from expiry date does the account go invalid)
|
||||||
|
** The previous version just left all of those fields blank.
|
||||||
|
** There is still one field left (expiry date for the account, period)
|
||||||
|
** which I have left blank because I do not use it and didn't want to
|
||||||
|
** spend any more time on this. I'm sure someone will put it in and
|
||||||
|
** tack another plethora of credits on here. :)
|
||||||
|
** Added in the password date field, which should always reflect the last
|
||||||
|
** date the password was changed, for expiry purposes. "passwd" always
|
||||||
|
** updates this field, so the adduser program should set it up right
|
||||||
|
** initially (or a user could keep thier initial password forever ;)
|
||||||
|
** The number is in days since Jan 1st, 1970.
|
||||||
|
**
|
||||||
|
** Have fun with it, and someone please make
|
||||||
|
** a real version(this is still just a hack)
|
||||||
|
** for us all to use (and Email it to me???)
|
||||||
|
**
|
||||||
|
** Brandon
|
||||||
|
** photon@usis.com
|
||||||
|
**
|
||||||
|
*****
|
||||||
|
** adduser 1.0: add a new user account (For systems not using shadow)
|
||||||
|
** With a nice little interface and a will to do all the work for you.
|
||||||
|
**
|
||||||
|
** Craig Hagan
|
||||||
|
** hagan@opine.cs.umass.edu
|
||||||
|
**
|
||||||
|
** Modified to really work, look clean, and find unused uid by Chris Cappuccio
|
||||||
|
** chris@slinky.cs.umass.edu
|
||||||
|
**
|
||||||
|
*****
|
||||||
|
**
|
||||||
|
** 01/19/95
|
||||||
|
**
|
||||||
|
** FURTHER modifications to enable shadow passwd support (kludged, but
|
||||||
|
** no more so than the original) by Dan Crowson - dcrowson@mo.net
|
||||||
|
**
|
||||||
|
** Search on DAN for all changes...
|
||||||
|
**
|
||||||
|
*****
|
||||||
|
**
|
||||||
|
** cc -O -o adduser adduser.c
|
||||||
|
** Use gcc if you have it... (political reasons beyond my control) (chris)
|
||||||
|
**
|
||||||
|
** I've gotten this program to work with success under Linux (without
|
||||||
|
** shadow) and SunOS 4.1.3. I would assume it should work pretty well
|
||||||
|
** on any system that uses no shadow. (chris)
|
||||||
|
**
|
||||||
|
** If you have no crypt() then try
|
||||||
|
** cc -DNO_CRYPT -O -o adduser adduser.c xfdes.c
|
||||||
|
** I'm not sure how login operates with no crypt()... I guess
|
||||||
|
** the same way we're doing it here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/timeb.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
|
||||||
|
#define IMMEDIATE_CHANGE /* Expire newly created password, must be changed
|
||||||
|
* immediately upon next login */
|
||||||
|
#define HAVE_QUOTAS /* Obvious */
|
||||||
|
#define EXPIRE_VALS_SET /* If defined, 'normal' users can't change
|
||||||
|
* password expiry values (if running suid root) */
|
||||||
|
|
||||||
|
#define HAVE_GETUSERSHELL /* FIXME: Isn't this defined in config.h too? */
|
||||||
|
#define LOGGING /* If we want to log various things to syslog */
|
||||||
|
#define MAX_USRNAME 8 /* Longer usernames seem to work on my system....
|
||||||
|
* But they're probably a poor idea */
|
||||||
|
|
||||||
|
|
||||||
|
#define DEFAULT_SHELL "/bin/bash" /* because BASH is your friend */
|
||||||
|
#define DEFAULT_HOME "/home"
|
||||||
|
#define USERADD_PATH "/usr/sbin/useradd"
|
||||||
|
#define CHAGE_PATH "/usr/bin/chage"
|
||||||
|
#define PASSWD_PATH "/usr/bin/passwd"
|
||||||
|
#define EDQUOTA_PATH "/usr/sbin/edquota"
|
||||||
|
#define QUOTA_DEFAULT "defuser"
|
||||||
|
#define DEFAULT_GROUP 100
|
||||||
|
|
||||||
|
#define DEFAULT_MIN_PASS 0
|
||||||
|
#define DEFAULT_MAX_PASS 100
|
||||||
|
#define DEFAULT_WARN_PASS 14
|
||||||
|
#define DEFAULT_USER_DIE 366
|
||||||
|
|
||||||
|
void safeget (char *, int);
|
||||||
|
|
||||||
|
void
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
char foo[32];
|
||||||
|
char usrname[32], person[32], dir[32], shell[32];
|
||||||
|
unsigned int group, min_pass, max_pass, warn_pass, user_die;
|
||||||
|
/* the group and uid of the new user */
|
||||||
|
int bad = 0, done = 0, correct = 0, olduid;
|
||||||
|
char cmd[255];
|
||||||
|
struct group *grp;
|
||||||
|
|
||||||
|
/* flags, in order:
|
||||||
|
* bad to see if the username is in /etc/passwd, or if strange stuff has
|
||||||
|
* been typed if the user might be put in group 0
|
||||||
|
* done allows the program to exit when a user has been added
|
||||||
|
* correct loops until a username is found that isn't in /etc/passwd
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The real program starts HERE! */
|
||||||
|
|
||||||
|
if (geteuid () != 0)
|
||||||
|
{
|
||||||
|
printf ("It seems you don't have access to add a new user. Try\n");
|
||||||
|
printf ("logging in as root or su root to gain super-user access.\n");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanity checks
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef LOGGING
|
||||||
|
openlog ("adduser", LOG_PID | LOG_CONS | LOG_NOWAIT, LOG_AUTH);
|
||||||
|
syslog (LOG_INFO, "invoked by user %s\n", getpwuid (getuid ())->pw_name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!(grp = getgrgid (DEFAULT_GROUP)))
|
||||||
|
{
|
||||||
|
printf ("Error: the default group %d does not exist on this system!\n",
|
||||||
|
DEFAULT_GROUP);
|
||||||
|
printf ("adduser must be recompiled.\n");
|
||||||
|
#ifdef LOGGING
|
||||||
|
syslog (LOG_ERR, "warning: failed. no such default group\n");
|
||||||
|
closelog ();
|
||||||
|
#endif
|
||||||
|
exit (1);
|
||||||
|
};
|
||||||
|
|
||||||
|
while (!correct)
|
||||||
|
{ /* loop until a "good" usrname is chosen */
|
||||||
|
while (!done)
|
||||||
|
{
|
||||||
|
printf ("\nLogin to add (^C to quit): ");
|
||||||
|
fflush (stdout);
|
||||||
|
|
||||||
|
safeget (usrname, sizeof (usrname));
|
||||||
|
|
||||||
|
if (!strlen (usrname))
|
||||||
|
{
|
||||||
|
printf ("Empty input.\n");
|
||||||
|
done = 0;
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* what I saw here before made me think maybe I was running DOS */
|
||||||
|
/* might this be a solution? (chris) */
|
||||||
|
if (strlen (usrname) > MAX_USRNAME)
|
||||||
|
{
|
||||||
|
printf ("That name is longer than the maximum of %d characters. Choose another.\n", MAX_USRNAME);
|
||||||
|
done = 0;
|
||||||
|
}
|
||||||
|
else if (getpwnam (usrname) != NULL)
|
||||||
|
{
|
||||||
|
printf ("That name is in use, choose another.\n");
|
||||||
|
done = 0;
|
||||||
|
}
|
||||||
|
else if (strchr (usrname, ' ') != NULL)
|
||||||
|
{
|
||||||
|
printf ("No spaces in username!!\n");
|
||||||
|
done = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
done = 1;
|
||||||
|
}; /* done, we have a valid new user name */
|
||||||
|
|
||||||
|
/* all set, get the rest of the stuff */
|
||||||
|
printf ("\nEditing information for new user [%s]\n", usrname);
|
||||||
|
|
||||||
|
printf ("\nFull Name [%s]: ", usrname);
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (person, sizeof (person));
|
||||||
|
if (!strlen (person))
|
||||||
|
{
|
||||||
|
bzero (person, sizeof (person));
|
||||||
|
strcpy (person, usrname);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (getuid () == 0)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
bad = 0;
|
||||||
|
printf ("GID [%d]: ", DEFAULT_GROUP);
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (foo, sizeof (foo));
|
||||||
|
if (!strlen (foo))
|
||||||
|
group = DEFAULT_GROUP;
|
||||||
|
else if (isdigit (*foo))
|
||||||
|
{
|
||||||
|
group = atoi (foo);
|
||||||
|
if (!(grp = getgrgid (group)))
|
||||||
|
{
|
||||||
|
printf ("unknown gid %s\n", foo);
|
||||||
|
group = DEFAULT_GROUP;
|
||||||
|
bad = 1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if ((grp = getgrnam (foo)))
|
||||||
|
group = grp->gr_gid;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf ("unknown group %s\n", foo);
|
||||||
|
group = DEFAULT_GROUP;
|
||||||
|
bad = 1;
|
||||||
|
}
|
||||||
|
if (group == 0)
|
||||||
|
{ /* You're not allowed to make root group users! */
|
||||||
|
printf ("Creation of root group users not allowed (must be done by hand)\n");
|
||||||
|
group = DEFAULT_GROUP;
|
||||||
|
bad = 1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
while (bad);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf ("Group will be default of: %d\n", DEFAULT_GROUP);
|
||||||
|
group = DEFAULT_GROUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getuid () == 0)
|
||||||
|
{
|
||||||
|
printf ("\nIf home dir ends with a / then '%s' will be appended to it\n", usrname);
|
||||||
|
printf ("Home Directory [%s/%s]: ", DEFAULT_HOME, usrname);
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (dir, sizeof (dir));
|
||||||
|
if (!strlen (dir))
|
||||||
|
{ /* hit return */
|
||||||
|
sprintf (dir, "%s/%s", DEFAULT_HOME, usrname);
|
||||||
|
}
|
||||||
|
else if (dir[strlen (dir) - 1] == '/')
|
||||||
|
sprintf (dir, "%s%s", dir, usrname);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf ("\nHome directory will be %s/%s\n", DEFAULT_HOME, usrname);
|
||||||
|
sprintf (dir, "%s/%s", DEFAULT_HOME, usrname);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("\nShell [%s]: ", DEFAULT_SHELL);
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (shell, sizeof (shell));
|
||||||
|
if (!strlen (shell))
|
||||||
|
sprintf (shell, "%s", DEFAULT_SHELL);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *sh;
|
||||||
|
int ok = 0;
|
||||||
|
#ifdef HAVE_GETUSERSHELL
|
||||||
|
setusershell ();
|
||||||
|
while ((sh = getusershell ()) != NULL)
|
||||||
|
if (!strcmp (shell, sh))
|
||||||
|
ok = 1;
|
||||||
|
endusershell ();
|
||||||
|
#endif
|
||||||
|
if (!ok)
|
||||||
|
{
|
||||||
|
if (getuid () == 0)
|
||||||
|
printf ("Warning: root allowed non standard shell\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf ("Shell NOT in /etc/shells, DEFAULT used\n");
|
||||||
|
sprintf (shell, "%s", DEFAULT_SHELL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef EXPIRE_VALS_SET
|
||||||
|
if (getuid () == 0)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
printf ("\nMin. Password Change Days [%d]: ", DEFAULT_MIN_PASS);
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (foo, sizeof (foo));
|
||||||
|
if (strlen (foo) > 1)
|
||||||
|
min_pass = DEFAULT_MIN_PASS;
|
||||||
|
else
|
||||||
|
min_pass = atoi (foo);
|
||||||
|
|
||||||
|
printf ("Max. Password Change Days [%d]: ", DEFAULT_MAX_PASS);
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (foo, sizeof (foo));
|
||||||
|
if (strlen (foo) > 1)
|
||||||
|
max_pass = atoi (foo);
|
||||||
|
else
|
||||||
|
max_pass = DEFAULT_MAX_PASS;
|
||||||
|
|
||||||
|
printf ("Password Warning Days [%d]: ", DEFAULT_WARN_PASS);
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (foo, sizeof (foo));
|
||||||
|
warn_pass = atoi (foo);
|
||||||
|
if (warn_pass == 0)
|
||||||
|
|
||||||
|
warn_pass = DEFAULT_WARN_PASS;
|
||||||
|
|
||||||
|
printf ("Days after Password Expiry for Account Locking [%d]: ", DEFAULT_USER_DIE);
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (foo, sizeof (foo));
|
||||||
|
user_die = atoi (foo);
|
||||||
|
if (user_die == 0)
|
||||||
|
user_die = DEFAULT_USER_DIE;
|
||||||
|
|
||||||
|
#ifdef EXPIRE_VALS_SET
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf ("\nSorry, account expiry values are set.\n");
|
||||||
|
user_die = DEFAULT_USER_DIE;
|
||||||
|
warn_pass = DEFAULT_WARN_PASS;
|
||||||
|
max_pass = DEFAULT_MAX_PASS;
|
||||||
|
min_pass = DEFAULT_MIN_PASS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf ("\nInformation for new user [%s] [%s]:\n", usrname, person);
|
||||||
|
printf ("Home directory: [%s] Shell: [%s]\n", dir, shell);
|
||||||
|
printf ("GID: [%d]\n", group);
|
||||||
|
printf ("MinPass: [%d] MaxPass: [%d] WarnPass: [%d] UserExpire: [%d]\n",
|
||||||
|
min_pass, max_pass, warn_pass, user_die);
|
||||||
|
printf ("\nIs this correct? [y/N]: ");
|
||||||
|
fflush (stdout);
|
||||||
|
safeget (foo, sizeof (foo));
|
||||||
|
|
||||||
|
done = bad = correct = (foo[0] == 'y' || foo[0] == 'Y');
|
||||||
|
|
||||||
|
if (bad != 1)
|
||||||
|
printf ("\nUser [%s] not added\n", usrname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clobber the environment, I run this suid root sometimes to let
|
||||||
|
* non root privileged accounts add users --chris */
|
||||||
|
|
||||||
|
*environ = NULL;
|
||||||
|
|
||||||
|
bzero (cmd, sizeof (cmd));
|
||||||
|
sprintf (cmd, "%s -g %d -d %s -s %s -c \"%s\" -m -k /etc/skel %s",
|
||||||
|
USERADD_PATH, group, dir, shell, person, usrname);
|
||||||
|
printf ("Calling useradd to add new user:\n%s\n", cmd);
|
||||||
|
if (system (cmd))
|
||||||
|
{
|
||||||
|
printf ("User add failed!\n");
|
||||||
|
#ifdef LOGGING
|
||||||
|
syslog (LOG_ERR, "could not add new user\n");
|
||||||
|
closelog ();
|
||||||
|
#endif
|
||||||
|
exit (errno);
|
||||||
|
};
|
||||||
|
|
||||||
|
olduid = getuid (); /* chage, passwd, edquota etc. require ruid = root
|
||||||
|
*/
|
||||||
|
setuid (0);
|
||||||
|
|
||||||
|
bzero (cmd, sizeof (cmd));
|
||||||
|
|
||||||
|
/* Chage runs suid root. => we need ruid root to run it with
|
||||||
|
* anything other than chage -l
|
||||||
|
*/
|
||||||
|
|
||||||
|
sprintf (cmd, "%s -m %d -M %d -W %d -I %d %s", CHAGE_PATH,
|
||||||
|
min_pass, max_pass, warn_pass, user_die, usrname);
|
||||||
|
printf ("%s\n", cmd);
|
||||||
|
if (system (cmd))
|
||||||
|
{
|
||||||
|
printf ("There was an error setting password expire values\n");
|
||||||
|
#ifdef LOGGING
|
||||||
|
syslog (LOG_ERR, "password expire values could not be set\n");
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/* I want to add a user completely with one easy command --chris */
|
||||||
|
|
||||||
|
#ifdef HAVE_QUOTAS
|
||||||
|
bzero (cmd, sizeof (cmd));
|
||||||
|
sprintf (cmd, "%s -p %s -u %s", EDQUOTA_PATH, QUOTA_DEFAULT, usrname);
|
||||||
|
printf ("%s\n", cmd);
|
||||||
|
if (system (cmd))
|
||||||
|
{
|
||||||
|
printf ("\nWarning: error setting quota\n");
|
||||||
|
#ifdef LOGGING
|
||||||
|
syslog (LOG_ERR, "warning: account created but NO quotas set!\n");
|
||||||
|
#endif /* LOGGING */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf ("\nDefault quota set.\n");
|
||||||
|
#endif /* HAVE_QUOTAS */
|
||||||
|
|
||||||
|
bzero (cmd, sizeof (cmd));
|
||||||
|
sprintf (cmd, "%s %s", PASSWD_PATH, usrname);
|
||||||
|
if (system (cmd))
|
||||||
|
{
|
||||||
|
printf ("\nWarning: error setting password\n");
|
||||||
|
#ifdef LOGGING
|
||||||
|
syslog (LOG_ERR, "warning: password set failed!\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef IMMEDIATE_CHANGE
|
||||||
|
bzero (cmd, sizeof (cmd));
|
||||||
|
sprintf (cmd, "%s -e %s", PASSWD_PATH, usrname);
|
||||||
|
if (system (cmd))
|
||||||
|
{
|
||||||
|
printf ("\nWarning: error expiring password\n");
|
||||||
|
#ifdef LOGGING
|
||||||
|
syslog (LOG_ERR, "warning: password expire failed!\n");
|
||||||
|
#endif /* LOGGING */
|
||||||
|
}
|
||||||
|
#endif /* IMMEDIATE_CHANGE */
|
||||||
|
|
||||||
|
setuid (olduid);
|
||||||
|
|
||||||
|
#ifdef LOGGING
|
||||||
|
closelog ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf ("\nDone.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
safeget (char *buf, int maxlen)
|
||||||
|
{
|
||||||
|
int c, i = 0, bad = 0;
|
||||||
|
char *bstart = buf;
|
||||||
|
while ((c = getc (stdin)) != EOF && (c != '\n') && (++i < maxlen))
|
||||||
|
{
|
||||||
|
bad = (!isalnum (c) && (c != '_') && (c != ' '));
|
||||||
|
*(buf++) = (char) c;
|
||||||
|
}
|
||||||
|
*buf = '\0';
|
||||||
|
|
||||||
|
if (bad)
|
||||||
|
{
|
||||||
|
printf ("\nString contained banned character. Please stick to alphanumerics.\n");
|
||||||
|
*bstart = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
90
contrib/adduser.sh
Executable file
90
contrib/adduser.sh
Executable file
@@ -0,0 +1,90 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# adduser script for use with shadow passwords and useradd command.
|
||||||
|
# by Hrvoje Dogan <hdogan@student.math.hr>, Dec 1995.
|
||||||
|
|
||||||
|
echo -n "Login name for new user []:"
|
||||||
|
read LOGIN
|
||||||
|
if [ -z $LOGIN ]
|
||||||
|
then echo "Come on, man, you can't leave the login field empty...";exit
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
echo -n "User id for $LOGIN [ defaults to next available]:"
|
||||||
|
read ID
|
||||||
|
GUID="-u $ID"
|
||||||
|
if [ -z $ID ]
|
||||||
|
then GUID=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -n "Initial group for $LOGIN [users]:"
|
||||||
|
read GID
|
||||||
|
GGID="-g $GID"
|
||||||
|
if [ -z $GID ]
|
||||||
|
then GGID=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -n "Additional groups for $LOGIN []:"
|
||||||
|
read AGID
|
||||||
|
GAGID="-G $AGID"
|
||||||
|
if [ -z $AGID ]
|
||||||
|
then GAGID=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -n "$LOGIN's home directory [/home/$LOGIN]:"
|
||||||
|
read HME
|
||||||
|
GHME="-d $HME"
|
||||||
|
if [ -z $HME ]
|
||||||
|
then GHME=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -n "$LOGIN's shell [/bin/bash]:"
|
||||||
|
read SHL
|
||||||
|
GSHL="-s $SHL"
|
||||||
|
if [ -z $SHL ]
|
||||||
|
then GSHL=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -n "$LOGIN's account expiry date (MM/DD/YY) []:"
|
||||||
|
read EXP
|
||||||
|
GEXP="-e $EXP"
|
||||||
|
if [ -z $EXP ]
|
||||||
|
then GEXP=""
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
echo OK, I'm about to make a new account. Here's what you entered so far:
|
||||||
|
echo New login name: $LOGIN
|
||||||
|
if [ -z $GUID ]
|
||||||
|
then echo New UID: [Next available]
|
||||||
|
else echo New UID: $UID
|
||||||
|
fi
|
||||||
|
if [ -z $GGID ]
|
||||||
|
then echo Initial group: users
|
||||||
|
else echo Initial group: $GID
|
||||||
|
fi
|
||||||
|
if [ -z $GAGID ]
|
||||||
|
then echo Additional groups: [none]
|
||||||
|
else echo Additional groups: $AGID
|
||||||
|
fi
|
||||||
|
if [ -z $GHME ]
|
||||||
|
then echo Home directory: /home/$LOGIN
|
||||||
|
else echo Home directory: $HME
|
||||||
|
fi
|
||||||
|
if [ -z $GSHL ]
|
||||||
|
then echo Shell: /bin/bash
|
||||||
|
else echo Shell: $SHL
|
||||||
|
fi
|
||||||
|
if [ -z $GEXP ]
|
||||||
|
then echo Expiry date: [no expiration]
|
||||||
|
else echo Expiry date: $EXP
|
||||||
|
fi
|
||||||
|
echo "This is it... if you want to bail out, you'd better do it now."
|
||||||
|
read FOO
|
||||||
|
echo Making new account...
|
||||||
|
/usr/sbin/useradd $GHME -m $GEXP $GGID $GAGID $GSHL $GUID $LOGIN
|
||||||
|
/usr/bin/chfn $LOGIN
|
||||||
|
/usr/bin/passwd $LOGIN
|
||||||
|
echo "Done..."
|
||||||
743
contrib/adduser2.sh
Executable file
743
contrib/adduser2.sh
Executable file
@@ -0,0 +1,743 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# adduser Interactive user adding program.
|
||||||
|
#
|
||||||
|
# Copyright (C) 1996 Petri Mattila, Prihateam Networks
|
||||||
|
# petri@prihateam.fi
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# Changes:
|
||||||
|
# 220496 v0.01 Initial version
|
||||||
|
# 230496 v0.02 More checks, embolden summary
|
||||||
|
# 240496 Even more checks
|
||||||
|
# 250496 Help with ?
|
||||||
|
# 040596 v0.03 Cleanups
|
||||||
|
# 050596 v0.04 Bug fixes, expire date checks
|
||||||
|
# 070596 v0.05 Iso-latin-1 names
|
||||||
|
#
|
||||||
|
|
||||||
|
## Defaults
|
||||||
|
|
||||||
|
# default groups
|
||||||
|
def_group="users"
|
||||||
|
def_other_groups=""
|
||||||
|
|
||||||
|
# default home directory
|
||||||
|
def_home_dir=/home/users
|
||||||
|
|
||||||
|
# default shell
|
||||||
|
def_shell=/bin/tcsh
|
||||||
|
|
||||||
|
# Defaul expiration date (mm/dd/yy)
|
||||||
|
def_expire=""
|
||||||
|
|
||||||
|
# default dates
|
||||||
|
def_pwd_min=0
|
||||||
|
def_pwd_max=90
|
||||||
|
def_pwd_warn=14
|
||||||
|
def_pwd_iact=14
|
||||||
|
|
||||||
|
|
||||||
|
# possible UIDs
|
||||||
|
uid_low=1000
|
||||||
|
uid_high=64000
|
||||||
|
|
||||||
|
# skel directory
|
||||||
|
skel=/etc/skel
|
||||||
|
|
||||||
|
# default mode for home directory
|
||||||
|
def_mode=711
|
||||||
|
|
||||||
|
# Regex, that the login name must meet, only ANSI characters
|
||||||
|
login_regex='^[0-9a-zA-Z_-]*$'
|
||||||
|
|
||||||
|
# Regex, that the user name must meet
|
||||||
|
# ANSI version
|
||||||
|
##name_regex='^[0-9a-zA-Z_-\ ]*$'
|
||||||
|
# ISO-LATIN-1 version
|
||||||
|
name_regex='^[0-9a-zA-Z<><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_-\ ]*$'
|
||||||
|
|
||||||
|
# set PATH
|
||||||
|
export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
|
||||||
|
|
||||||
|
# Some special characters
|
||||||
|
case "$TERM" in
|
||||||
|
vt*|ansi*|con*|xterm*|linux*)
|
||||||
|
S='[1m' # start embolden
|
||||||
|
E='[m' # end embolden
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
S=''
|
||||||
|
E=''
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
|
||||||
|
check_root() {
|
||||||
|
if test "$EUID" -ne 0
|
||||||
|
then
|
||||||
|
echo "You must be root to run this program."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_user() {
|
||||||
|
local usr pwd uid gid name home sh
|
||||||
|
|
||||||
|
cat /etc/passwd | (
|
||||||
|
while IFS=":" read usr pwd uid gid name home sh
|
||||||
|
do
|
||||||
|
if test "$1" = "${usr}"
|
||||||
|
then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
check_group() {
|
||||||
|
local read grp pwd gid members
|
||||||
|
|
||||||
|
cat /etc/group | (
|
||||||
|
while IFS=":" read grp pwd gid members
|
||||||
|
do
|
||||||
|
if test "$1" = "${grp}"
|
||||||
|
then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
check_other_groups() {
|
||||||
|
local grp check IFS
|
||||||
|
|
||||||
|
check="$1"
|
||||||
|
IFS=","
|
||||||
|
|
||||||
|
set ${check}
|
||||||
|
for grp
|
||||||
|
do
|
||||||
|
if check_group "${grp}"
|
||||||
|
then
|
||||||
|
echo "Group ${grp} does not exist."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
check_uid() {
|
||||||
|
local usr pwd uid gid name home sh
|
||||||
|
|
||||||
|
cat /etc/passwd | (
|
||||||
|
while IFS=":" read usr pwd uid gid name home sh
|
||||||
|
do
|
||||||
|
if test "$1" = "${uid}"
|
||||||
|
then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
read_yn() {
|
||||||
|
local ans ynd
|
||||||
|
|
||||||
|
ynd="$1"
|
||||||
|
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
read ans
|
||||||
|
case "${ans}" in
|
||||||
|
"") return ${ynd} ;;
|
||||||
|
[nN]) return 1 ;;
|
||||||
|
[yY]) return 0 ;;
|
||||||
|
*) echo -n "Y or N, please ? " ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_login() {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -n "Login: ${def_login:+[${def_login}] }"
|
||||||
|
read login
|
||||||
|
|
||||||
|
if test "${login}" = '?'
|
||||||
|
then
|
||||||
|
less /etc/passwd
|
||||||
|
echo
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "${login}" -a -n "${def_login}"
|
||||||
|
then
|
||||||
|
login="${def_login}"
|
||||||
|
echo "Using ${login}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "${#login}" -gt 8
|
||||||
|
then
|
||||||
|
echo "Login must be at most 8 characters long"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "${#login}" -lt 2
|
||||||
|
then
|
||||||
|
echo "Login must be at least 2 characters long"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expr "${login}" : "${login_regex}" &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use letters, numbers and special characters _-,."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! check_user "${login}"
|
||||||
|
then
|
||||||
|
echo "Username ${login} is already in use"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_login="${login}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_name () {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -n "Real name: ${def_name:+[${def_name}] }"
|
||||||
|
read name
|
||||||
|
|
||||||
|
if test "${name}" = '?'
|
||||||
|
then
|
||||||
|
less /etc/passwd
|
||||||
|
echo
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "${name}" -a -n "${def_name}"
|
||||||
|
then
|
||||||
|
name="${def_name}"
|
||||||
|
echo "Using ${name}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "${#name}" -gt 32
|
||||||
|
then
|
||||||
|
echo "Name should be at most 32 characters long"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expr "${name}" : "${name_regex}" &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use letters, numbers, spaces and special characters ,._-"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_name="${name}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_home() {
|
||||||
|
local x
|
||||||
|
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -n "Home Directory: [${def_home_dir}/${login}] "
|
||||||
|
read home
|
||||||
|
|
||||||
|
if test -z "${home}"
|
||||||
|
then
|
||||||
|
home="${def_home_dir}/${login}"
|
||||||
|
echo "Using ${home}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expr "${home}" : '^[0-9a-zA-Z,._-\/]*$' &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use letters, numbers, spaces and special characters ,._-/"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
x="$(basename ${home})"
|
||||||
|
if test "${x}" != "${login}"
|
||||||
|
then
|
||||||
|
echo "Warning: you are about to use different login name and home directory."
|
||||||
|
fi
|
||||||
|
|
||||||
|
x="$(dirname ${home})"
|
||||||
|
if ! test -d "${x}"
|
||||||
|
then
|
||||||
|
echo "Directory ${x} does not exist."
|
||||||
|
echo "If you still want to use it, please make it manually."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_home_dir="${x}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_shell () {
|
||||||
|
local x
|
||||||
|
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -n "Shell: [${def_shell}] "
|
||||||
|
read shell
|
||||||
|
|
||||||
|
if test -z "${shell}"
|
||||||
|
then
|
||||||
|
shell="${def_shell}"
|
||||||
|
echo "Using ${shell}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for x in $(cat /etc/shells)
|
||||||
|
do
|
||||||
|
if test "${x}" = "${shell}"
|
||||||
|
then
|
||||||
|
def_shell="${shell}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Possible shells are:"
|
||||||
|
cat /etc/shells
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_group () {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -n "Group: [${def_group}] "
|
||||||
|
read group
|
||||||
|
|
||||||
|
if test -z "${group}"
|
||||||
|
then
|
||||||
|
group="${def_group}"
|
||||||
|
echo "Using ${group}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "${group}" = '?'
|
||||||
|
then
|
||||||
|
less /etc/group
|
||||||
|
echo
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if check_group "${group}"
|
||||||
|
then
|
||||||
|
echo "Group ${group} does not exist."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_group="${group}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_other_groups () {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -n "Other groups: [${def_og:-none}] "
|
||||||
|
read other_groups
|
||||||
|
|
||||||
|
if test "${other_groups}" = '?'
|
||||||
|
then
|
||||||
|
less /etc/group
|
||||||
|
echo
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -z "${other_groups}"
|
||||||
|
then
|
||||||
|
if test -n "${def_og}"
|
||||||
|
then
|
||||||
|
other_groups="${def_og}"
|
||||||
|
echo "Using ${other_groups}"
|
||||||
|
else
|
||||||
|
echo "No other groups"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if ! check_other_groups "${other_groups}"
|
||||||
|
then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_og="${other_groups}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_uid () {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -n "uid: [first free] "
|
||||||
|
read uid
|
||||||
|
|
||||||
|
if test -z "${uid}"
|
||||||
|
then
|
||||||
|
echo "Using first free UID."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "${uid}" = '?'
|
||||||
|
then
|
||||||
|
less /etc/passwd
|
||||||
|
echo
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expr "${uid}" : '^[0-9]+$' &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use numbers only."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if test "${uid}" -lt "${uid_low}"
|
||||||
|
then
|
||||||
|
echo "UID must be greater than ${uid_low}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if test "${uid}" -gt "${uid_high}"
|
||||||
|
then
|
||||||
|
echo "UID must be smaller than ${uid_high}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if ! check_uid "${uid}"
|
||||||
|
then
|
||||||
|
echo "UID ${uid} is already in use"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_max_valid_days() {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -en "Maximum days between password changes: [${def_pwd_max}] "
|
||||||
|
read max_days
|
||||||
|
|
||||||
|
if test -z "${max_days}"
|
||||||
|
then
|
||||||
|
max_days="${def_pwd_max}"
|
||||||
|
echo "Using ${max_days}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expr "${max_days}" : '^[0-9]+$' &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use numbers only."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if test "${max_days}" -lt 7
|
||||||
|
then
|
||||||
|
echo "Warning: you are using a value shorter than a week."
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_pwd_max="${max_days}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_min_valid_days() {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -en "Minimum days between password changes: [${def_pwd_min}] "
|
||||||
|
read min_days
|
||||||
|
|
||||||
|
if test -z "${min_days}"
|
||||||
|
then
|
||||||
|
min_days="${def_pwd_min}"
|
||||||
|
echo "Using ${min_days}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expr "${min_days}" : '^[0-9]+$' &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use numbers only."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if test "${min_days}" -gt 7
|
||||||
|
then
|
||||||
|
echo "Warning: you are using a value longer than a week."
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_pwd_min="${min_days}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_warning_days() {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -en "Number of warning days before password expires: [${def_pwd_warn}] "
|
||||||
|
read warn_days
|
||||||
|
|
||||||
|
if test -z "${warn_days}"
|
||||||
|
then
|
||||||
|
warn_days="${def_pwd_warn}"
|
||||||
|
echo "Using ${warn_days}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expr "${warn_days}" : '^[0-9]+$' &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use numbers only."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if test "${warn_days}" -gt 14
|
||||||
|
then
|
||||||
|
echo "Warning: you are using a value longer than two week."
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_pwd_warn="${warn_days}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
read_inactive_days() {
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -en "Number of usable days after expiration: [${def_pwd_iact}] "
|
||||||
|
read iact_days
|
||||||
|
|
||||||
|
if test -z "${iact_days}"
|
||||||
|
then
|
||||||
|
iact_days="${def_pwd_iact}"
|
||||||
|
echo "Using ${iact_days}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
if ! expr "${iact_days}" : '^[0-9]+$' &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use numbers only."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if test "${iact_days}" -gt 14
|
||||||
|
then
|
||||||
|
echo "Warning: you are using a value that is more than two weeks."
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_pwd_iact="${iact_days}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_expire_date() {
|
||||||
|
local ans
|
||||||
|
|
||||||
|
echo
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
echo -en "Expire date of this account (mm/dd/yy): [${def_expire:-never}] "
|
||||||
|
read ans
|
||||||
|
|
||||||
|
if test -z "${ans}"
|
||||||
|
then
|
||||||
|
if test -z "${def_expire}"
|
||||||
|
then
|
||||||
|
ans="never"
|
||||||
|
else
|
||||||
|
ans="${def_expire}"
|
||||||
|
echo "Using ${def_expire}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "${ans}" = "never"
|
||||||
|
then
|
||||||
|
echo "Account will never expire."
|
||||||
|
def_expire=""
|
||||||
|
expire=""
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expr "${ans}" : '^[0-9][0-9]/[0-9][0-9]/[0-9][0-9]$' &> /dev/null
|
||||||
|
then
|
||||||
|
echo "Please use format mm/dd/yy"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! expire_date="$(date -d ${ans} '+%A, %B %d %Y')"
|
||||||
|
then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
def_expire="${expire}"
|
||||||
|
return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
read_passwd_yn() {
|
||||||
|
echo -en "\nDo you want to set password [Y/n] ? "
|
||||||
|
if read_yn 0
|
||||||
|
then
|
||||||
|
set_pwd="YES"
|
||||||
|
else
|
||||||
|
set_pwd=""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
print_values() {
|
||||||
|
|
||||||
|
clear
|
||||||
|
cat << EOM
|
||||||
|
|
||||||
|
Login: ${S}${login}${E}
|
||||||
|
Group: ${S}${group}${E}
|
||||||
|
Other groups: ${S}${other_groups:-[none]}${E}
|
||||||
|
|
||||||
|
Real Name: ${S}${name}${E}
|
||||||
|
|
||||||
|
uid: ${S}${uid:-[first free]}${E}
|
||||||
|
home: ${S}${home}${E}
|
||||||
|
shell: ${S}${shell}${E}
|
||||||
|
|
||||||
|
Account expiration date: ${S}${expire_date:-never}${E}
|
||||||
|
Minimum days between password changes: ${S}${min_days}${E}
|
||||||
|
Maximum days between password changes: ${S}${max_days}${E}
|
||||||
|
Number of usable days after expiration: ${S}${iact_days}${E}
|
||||||
|
Number of warning days before expiration: ${S}${warn_days}${E}
|
||||||
|
|
||||||
|
${S}${set_pwd:+Set password for this account.}${E}
|
||||||
|
|
||||||
|
EOM
|
||||||
|
}
|
||||||
|
|
||||||
|
set_user() {
|
||||||
|
if ! useradd \
|
||||||
|
-c "${name}" \
|
||||||
|
-d "${home}" \
|
||||||
|
-g "${group}" \
|
||||||
|
-s "${shell}" \
|
||||||
|
${expire:+-e ${expire}} \
|
||||||
|
${uid:+-u ${uid}} \
|
||||||
|
${other_groups:+-G ${other_groups}} \
|
||||||
|
${login}
|
||||||
|
then
|
||||||
|
echo "Error ($?) in useradd...exiting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
set_aging() {
|
||||||
|
if ! passwd \
|
||||||
|
-x ${max_days} \
|
||||||
|
-n ${min_days} \
|
||||||
|
-w ${warn_days} \
|
||||||
|
-i ${iact_days} \
|
||||||
|
${login}
|
||||||
|
then
|
||||||
|
echo "Error ($?) in setting password aging...exiting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
set_password() {
|
||||||
|
if test -n "${set_pwd}"
|
||||||
|
then
|
||||||
|
echo
|
||||||
|
passwd ${login}
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
set_system() {
|
||||||
|
if test -d "${home}"
|
||||||
|
then
|
||||||
|
echo "Directory ${home} already exists."
|
||||||
|
echo "Skeleton files not copied."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "Copying skeleton files..."
|
||||||
|
(
|
||||||
|
mkdir ${home}
|
||||||
|
cd ${skel} && cp -af . ${home}
|
||||||
|
chmod ${def_mode} ${home}
|
||||||
|
chown -R ${login}:${group} ${home}
|
||||||
|
)
|
||||||
|
echo "done."
|
||||||
|
|
||||||
|
## Add your own stuff here:
|
||||||
|
echo -n "Setting up other files..."
|
||||||
|
(
|
||||||
|
mailbox="/var/spool/mail/${login}"
|
||||||
|
touch ${mailbox}
|
||||||
|
chown "${login}:mail" ${mailbox}
|
||||||
|
chmod 600 ${mailbox}
|
||||||
|
)
|
||||||
|
echo "done."
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
read_values() {
|
||||||
|
clear
|
||||||
|
echo -e "\nPlease answer the following questions about the new user to be added."
|
||||||
|
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
read_login
|
||||||
|
read_name
|
||||||
|
read_group
|
||||||
|
read_other_groups
|
||||||
|
read_home
|
||||||
|
read_shell
|
||||||
|
read_uid
|
||||||
|
read_expire_date
|
||||||
|
read_max_valid_days
|
||||||
|
read_min_valid_days
|
||||||
|
read_warning_days
|
||||||
|
read_inactive_days
|
||||||
|
read_passwd_yn
|
||||||
|
|
||||||
|
print_values
|
||||||
|
|
||||||
|
echo -n "Is this correct [N/y] ? "
|
||||||
|
read_yn 1 && return
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
main() {
|
||||||
|
check_root
|
||||||
|
read_values
|
||||||
|
set_user
|
||||||
|
set_aging
|
||||||
|
set_system
|
||||||
|
set_password
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
## Run it 8-)
|
||||||
|
main
|
||||||
|
|
||||||
|
# End.
|
||||||
85
contrib/atudel
Executable file
85
contrib/atudel
Executable file
@@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# Copyright (c) 1996 Brian R. Gaeke
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# 3. All advertising materials mentioning features or use of this software
|
||||||
|
# must display the following acknowledgement:
|
||||||
|
# This product includes software developed by Brian R. Gaeke.
|
||||||
|
# 4. The name of the author, Brian R. Gaeke, may not be used to endorse
|
||||||
|
# or promote products derived from this software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY BRIAN R. GAEKE ``AS IS'' AND ANY EXPRESS
|
||||||
|
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL BRIAN R. GAEKE BE LIABLE FOR ANY DIRECT,
|
||||||
|
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
# Additionally:
|
||||||
|
#
|
||||||
|
# This software is provided without support and without any obligation
|
||||||
|
# on the part of Brian R. Gaeke to assist in its use, correction,
|
||||||
|
# modification or enhancement.
|
||||||
|
#
|
||||||
|
#######################################################################
|
||||||
|
#
|
||||||
|
# this is atudel, version 2, by Brian R. Gaeke <brg@dgate.org>
|
||||||
|
#
|
||||||
|
|
||||||
|
require "getopts.pl";
|
||||||
|
&Getopts('v');
|
||||||
|
$username = shift(@ARGV);
|
||||||
|
&usage unless $username;
|
||||||
|
|
||||||
|
sub usage
|
||||||
|
{
|
||||||
|
print STDERR "atudel - remove all at jobs owned by a user\n";
|
||||||
|
print STDERR "usage: $0 [-v] username\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
# odd. unless getpwnam($uname) doesn't seem to work for $uname eq "root" on
|
||||||
|
# my linux system. but this does.
|
||||||
|
die "user $username does not exist; stopping"
|
||||||
|
unless defined(getpwnam($username));
|
||||||
|
|
||||||
|
print "searching for at jobs owned by user $username ..." if $opt_v;
|
||||||
|
|
||||||
|
chdir "/var/spool/atjobs" ||
|
||||||
|
die "can't chdir to /var/spool/atjobs: $!\nstopping";
|
||||||
|
opendir(DIR,".") || die "can't opendir(/var/spool/atjobs): $!\nstopping";
|
||||||
|
@files = grep(!/^\./,grep(-f,readdir(DIR)));
|
||||||
|
closedir DIR;
|
||||||
|
|
||||||
|
foreach $x (@files)
|
||||||
|
{
|
||||||
|
$owner = (getpwuid((stat($x))[4]))[0];
|
||||||
|
push(@nuke_bait,$x) if $owner eq $username;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (@nuke_bait)
|
||||||
|
{
|
||||||
|
print "removed jobIDs: @{nuke_bait}.\n" if $opt_v;
|
||||||
|
unlink @nuke_bait;
|
||||||
|
}
|
||||||
|
elsif ($opt_v)
|
||||||
|
{
|
||||||
|
print "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
exit 0;
|
||||||
308
contrib/pwdauth.c
Normal file
308
contrib/pwdauth.c
Normal file
@@ -0,0 +1,308 @@
|
|||||||
|
/*
|
||||||
|
* 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: pwdauth.c,v 1.2 1997/12/07 23:26:45 marekm Exp $";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
591
contrib/rpasswd.c
Normal file
591
contrib/rpasswd.c
Normal file
@@ -0,0 +1,591 @@
|
|||||||
|
/* rpasswd.c -- restricted `passwd' wrapper.
|
||||||
|
Copyright (C) 1996 Adam Solesby, Joshua Cowan
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* This program is meant to be a wrapper for use with `sudo' and your
|
||||||
|
system's `passwd' program. It is *probably* secure, but there is no
|
||||||
|
warranty (see above). If you find errors or security holes, please
|
||||||
|
email me; please include a complete description of the problem in
|
||||||
|
your message in addition to any patches. */
|
||||||
|
|
||||||
|
/* This program currently assumes that the arguments given on the
|
||||||
|
command line are user names to pass to the `passwd' program; it loops
|
||||||
|
through the arguments calling `passwd' on each one. It might be
|
||||||
|
better to pass all remaining arguments after `--' to `passwd' (to
|
||||||
|
e.g., change the user's shell instead of the password by giving it
|
||||||
|
the `-s' option). */
|
||||||
|
|
||||||
|
/* Written by Adam Solesby <adam@shack.com>. */
|
||||||
|
/* Rewritten by Joshua Cowan <jcowan@hermit.reslife.okstate.edu>. */
|
||||||
|
|
||||||
|
/* Usage: rpasswd USERNAME...
|
||||||
|
Enforce password-changing guidelines.
|
||||||
|
|
||||||
|
--check[=file] check configuration information; if FILE is given,
|
||||||
|
use that instead of the standard configuration
|
||||||
|
file `./rpasswd.conf'
|
||||||
|
--help display this help and exit
|
||||||
|
--version output version information and exit
|
||||||
|
|
||||||
|
You may never change a superuser's password with this command.
|
||||||
|
Changing certain other users' passwords may also be forbidden; for
|
||||||
|
details of who's passwords may not be changed, try `rpasswd --check'. */
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
|
|
||||||
|
- Make this more portable. It currently depends on several
|
||||||
|
GNU/Linux-specific features. */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
/* This is the absolute path to the `passwd' program on your system. */
|
||||||
|
#define _PATH_PASSWD "/usr/bin/passwd"
|
||||||
|
|
||||||
|
/* This is the absolute path to the configuration file. */
|
||||||
|
#define _PATH_RPASSWD_CONF "/etc/rpasswd.conf"
|
||||||
|
|
||||||
|
/* Don't change the password of any user with a uid equal to or below
|
||||||
|
this number--no matter what the configuration file says. */
|
||||||
|
#define UID_PWD_CHANGE_FLOOR 100
|
||||||
|
|
||||||
|
/* Everything past this point should probably be left alone. */
|
||||||
|
|
||||||
|
/* These are the facility and priority (respectively) used by the syslog
|
||||||
|
functions. */
|
||||||
|
#define LOG_FACILITY LOG_AUTH
|
||||||
|
#define LOG_PRIORITY LOG_WARNING
|
||||||
|
|
||||||
|
/* The name this program was run with. */
|
||||||
|
char *program_name;
|
||||||
|
|
||||||
|
/* The version information for this program. */
|
||||||
|
char *version_string = "1.2";
|
||||||
|
|
||||||
|
/* If nonzero, display usage information and exit. */
|
||||||
|
static int show_help;
|
||||||
|
|
||||||
|
/* If nonzero, print the version on standard output then exit. */
|
||||||
|
static int show_version;
|
||||||
|
|
||||||
|
/* If nonzero, check the configuration file for errors and print the
|
||||||
|
list of restrictions on the standard output, then exit. */
|
||||||
|
static int check_only;
|
||||||
|
|
||||||
|
struct user_list
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
struct user_list *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct config_info
|
||||||
|
{
|
||||||
|
/* Don't change the password for any user with a uid less than or
|
||||||
|
equal to this number. */
|
||||||
|
uid_t minimum_uid;
|
||||||
|
|
||||||
|
/* Don't change the password for any user matching this list of user
|
||||||
|
names. */
|
||||||
|
struct user_list *inviolate_user_names;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct option long_options[] =
|
||||||
|
{
|
||||||
|
{"check", optional_argument, 0, 10},
|
||||||
|
{"version", no_argument, &show_version, 1},
|
||||||
|
{"help", no_argument, &show_help, 1},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct config_info *get_config_info ();
|
||||||
|
static int dump_config_info ();
|
||||||
|
static void *xmalloc ();
|
||||||
|
static void *xrealloc ();
|
||||||
|
static void xsyslog (int, const char *, ...);
|
||||||
|
static void dal_error (int, int, const char *, ...);
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage (status)
|
||||||
|
int status;
|
||||||
|
{
|
||||||
|
if (status != 0)
|
||||||
|
fprintf (stderr, "Try `%s --help' for more information.\n",
|
||||||
|
program_name);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf ("Usage: %s USERNAME...\n", program_name);
|
||||||
|
fputs ("\
|
||||||
|
Enforce password-changing guidelines.\n\
|
||||||
|
\n\
|
||||||
|
--check[=file] check configuration information; if FILE is given,\n\
|
||||||
|
use that instead of the standard configuration file\n\
|
||||||
|
`"_PATH_RPASSWD_CONF"'\n\
|
||||||
|
--help display this help and exit\n\
|
||||||
|
--version output version information and exit\n",
|
||||||
|
stdout);
|
||||||
|
|
||||||
|
printf ("\n\
|
||||||
|
You may never change a superuser's password with this command. Changing\n\
|
||||||
|
certain other users' passwords may also be forbidden; for details of\n\
|
||||||
|
who's passwords may not be changed, try `%s --check'.\n",
|
||||||
|
program_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit (status);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (argc, argv)
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
{
|
||||||
|
char *executing_user_name;
|
||||||
|
char *config_file_name = _PATH_RPASSWD_CONF;
|
||||||
|
int opt;
|
||||||
|
struct config_info *config;
|
||||||
|
|
||||||
|
/* Setting values of global variables. */
|
||||||
|
program_name = argv[0];
|
||||||
|
|
||||||
|
while ((opt = getopt_long (argc, argv, "", long_options, 0))
|
||||||
|
!= EOF)
|
||||||
|
switch (opt)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
check_only = 1;
|
||||||
|
if (optarg)
|
||||||
|
config_file_name = optarg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
usage (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (show_version)
|
||||||
|
{
|
||||||
|
printf ("rpasswd %s\n", version_string);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (show_help)
|
||||||
|
{
|
||||||
|
usage (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_only)
|
||||||
|
{
|
||||||
|
dump_config_info (config_file_name);
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind >= argc)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "%s: missing argument\n", program_name);
|
||||||
|
usage (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: does `sudo' set the real user id to the effective user id?
|
||||||
|
If so, this won't work as intended: We want to get the name of the
|
||||||
|
user who ran `sudo'. I am reluctant to use `getlogin' for obvious
|
||||||
|
reasons, but it may be better than nothing. Maybe someone who
|
||||||
|
actually has `sudo' installed can tell me if this works, or how to
|
||||||
|
fix it if it doesn't. --JC */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
struct passwd *pwd;
|
||||||
|
uid_t uid = getuid ();
|
||||||
|
|
||||||
|
pwd = getpwuid (uid);
|
||||||
|
|
||||||
|
if (!pwd || !pwd->pw_name)
|
||||||
|
{
|
||||||
|
xsyslog (LOG_PRIORITY,
|
||||||
|
"Unknown user (uid #%d) attempted to change password for `%s'.",
|
||||||
|
uid, argv[optind]);
|
||||||
|
fprintf (stderr, "%s: you do not exist, go away\n",
|
||||||
|
program_name);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
executing_user_name = pwd->pw_name;
|
||||||
|
}
|
||||||
|
while (0);
|
||||||
|
|
||||||
|
config = get_config_info (config_file_name);
|
||||||
|
|
||||||
|
for (; optind < argc; optind++)
|
||||||
|
{
|
||||||
|
int immutable_p = 0;
|
||||||
|
struct user_list *user_names = config->inviolate_user_names;
|
||||||
|
|
||||||
|
/* Make sure we weren't given an illegal user name. */
|
||||||
|
for (; user_names; user_names = user_names->next)
|
||||||
|
{
|
||||||
|
if (strcmp (argv[optind], user_names->name)
|
||||||
|
== 0)
|
||||||
|
{
|
||||||
|
immutable_p = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!immutable_p)
|
||||||
|
{
|
||||||
|
struct passwd *pwd;
|
||||||
|
|
||||||
|
pwd = getpwnam (argv[optind]);
|
||||||
|
|
||||||
|
if (!pwd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "%s: invalid user `%s'\n",
|
||||||
|
program_name, argv[optind]);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (pwd->pw_uid <= config->minimum_uid)
|
||||||
|
immutable_p = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (immutable_p)
|
||||||
|
{
|
||||||
|
xsyslog (LOG_PRIORITY,
|
||||||
|
"`%s' attempted to change password for `%s'.",
|
||||||
|
executing_user_name, argv[optind]);
|
||||||
|
fprintf (stderr,
|
||||||
|
"You are not allowed to change the password for `%s'.\n",
|
||||||
|
argv[optind]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int pid, status;
|
||||||
|
|
||||||
|
pid = fork ();
|
||||||
|
switch (pid)
|
||||||
|
{
|
||||||
|
case -1:
|
||||||
|
dal_error (1, errno, "cannot fork");
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
execl (_PATH_PASSWD, _PATH_PASSWD, "--", argv[optind], 0);
|
||||||
|
_exit (1);
|
||||||
|
|
||||||
|
default:
|
||||||
|
while (wait (&status) != pid)
|
||||||
|
;
|
||||||
|
|
||||||
|
if (status & 0xFFFF)
|
||||||
|
dal_error (1, EIO, "%s", _PATH_PASSWD);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get configuration information from FILE and return a pointer to a
|
||||||
|
`config_info' structure containing that information. It currently
|
||||||
|
does minimal checking of the validity of the information.
|
||||||
|
|
||||||
|
This function never returns NULL, even when the configuration file is
|
||||||
|
empty. If the configuration file doesn't exist, it just exits with a
|
||||||
|
failed exit status. */
|
||||||
|
|
||||||
|
static struct config_info *
|
||||||
|
get_config_info (file)
|
||||||
|
const char *const file;
|
||||||
|
{
|
||||||
|
FILE *config_file;
|
||||||
|
struct config_info *config;
|
||||||
|
char linebuf[BUFSIZ];
|
||||||
|
unsigned int lineno = 0;
|
||||||
|
|
||||||
|
config = (struct config_info *) xmalloc (sizeof (struct config_info));
|
||||||
|
config->minimum_uid = (uid_t) 0;
|
||||||
|
config->inviolate_user_names = 0;
|
||||||
|
|
||||||
|
config_file = fopen (file, "r");
|
||||||
|
if (!config_file)
|
||||||
|
dal_error (1, errno, "%s", file);
|
||||||
|
|
||||||
|
if (fseek (config_file, 0L, SEEK_SET))
|
||||||
|
dal_error (1, errno, "%s", file);
|
||||||
|
|
||||||
|
while (fgets (linebuf, BUFSIZ, config_file))
|
||||||
|
{
|
||||||
|
int len, i, uid_found = 0;
|
||||||
|
|
||||||
|
lineno++;
|
||||||
|
|
||||||
|
len = strlen (linebuf);
|
||||||
|
|
||||||
|
/* Chomp any whitespace off the end of the line. */
|
||||||
|
while (isspace (linebuf[len - 1]))
|
||||||
|
linebuf[--len] = '\0';
|
||||||
|
|
||||||
|
/* If this line is empty or a comment, skip it and go to the next. */
|
||||||
|
if (len == 0 || *linebuf == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
if (!isalnum (linebuf[i])
|
||||||
|
&& linebuf[i] != '.'
|
||||||
|
&& linebuf[i] != '-'
|
||||||
|
&& linebuf[i] != '_')
|
||||||
|
{
|
||||||
|
dal_error (1, 0, "%s:%u: invalid user name `%s'",
|
||||||
|
file, lineno, linebuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only accept positive integers as candidates for `minimum_uid'. */
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
if (!isdigit (linebuf[i]))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!uid_found && i == len)
|
||||||
|
{
|
||||||
|
unsigned long num;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
num = strtoul (linebuf, 0, 10);
|
||||||
|
config->minimum_uid = (uid_t) num;
|
||||||
|
|
||||||
|
if (errno || config->minimum_uid != num)
|
||||||
|
dal_error (1, 0, "%s:%u: `%s' out of range",
|
||||||
|
file, lineno, linebuf);
|
||||||
|
|
||||||
|
uid_found = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct user_list *tail = config->inviolate_user_names;
|
||||||
|
struct user_list *user_names = 0;
|
||||||
|
|
||||||
|
/* This could be more efficient, but makes the list of users
|
||||||
|
printed out with the `--check' switch easier to read. */
|
||||||
|
|
||||||
|
for (; tail; tail = tail->next)
|
||||||
|
{
|
||||||
|
if (strcmp (linebuf, tail->name) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
user_names = tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tail)
|
||||||
|
{
|
||||||
|
tail = user_names;
|
||||||
|
|
||||||
|
user_names = xmalloc (sizeof (struct user_list));
|
||||||
|
user_names->name = strcpy (xmalloc (len + 1), linebuf);
|
||||||
|
user_names->next = 0;
|
||||||
|
|
||||||
|
if (!config->inviolate_user_names)
|
||||||
|
config->inviolate_user_names = user_names;
|
||||||
|
else
|
||||||
|
tail->next = user_names;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose (config_file);
|
||||||
|
|
||||||
|
if (config->minimum_uid < UID_PWD_CHANGE_FLOOR)
|
||||||
|
config->minimum_uid = UID_PWD_CHANGE_FLOOR;
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dump the configuration info contained in FILE to the standard output. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
dump_config_info (file)
|
||||||
|
char *file;
|
||||||
|
{
|
||||||
|
struct config_info *config;
|
||||||
|
|
||||||
|
config = get_config_info (file);
|
||||||
|
|
||||||
|
printf ("\
|
||||||
|
The lowest uid who's password may be changed is number %d. Changing
|
||||||
|
the following users' passwords is also forbidden:\n",
|
||||||
|
config->minimum_uid + 1);
|
||||||
|
|
||||||
|
if (!config->inviolate_user_names)
|
||||||
|
{
|
||||||
|
printf ("\n (no users listed in configuration file `%s')\n",
|
||||||
|
file);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int column;
|
||||||
|
struct user_list *user_names = config->inviolate_user_names;
|
||||||
|
|
||||||
|
for (column = 73; user_names; user_names = user_names->next)
|
||||||
|
{
|
||||||
|
int name_len = strlen (user_names->name);
|
||||||
|
|
||||||
|
if (user_names->next)
|
||||||
|
name_len++;
|
||||||
|
|
||||||
|
column += name_len;
|
||||||
|
|
||||||
|
if (column > 72)
|
||||||
|
{
|
||||||
|
fputs ("\n ", stdout);
|
||||||
|
column = name_len + 2;
|
||||||
|
}
|
||||||
|
else if (column - name_len > 0)
|
||||||
|
{
|
||||||
|
fputc (' ', stdout);
|
||||||
|
column++;
|
||||||
|
}
|
||||||
|
|
||||||
|
fputs (user_names->name, stdout);
|
||||||
|
|
||||||
|
if (user_names->next)
|
||||||
|
fputc (',', stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
fputc ('\n', stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
xmalloc (n)
|
||||||
|
size_t n;
|
||||||
|
{
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
|
ptr = malloc (n);
|
||||||
|
|
||||||
|
if (!ptr)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "%s: Memory exhausted\n", program_name);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
xrealloc (ptr, n)
|
||||||
|
void *ptr;
|
||||||
|
size_t n;
|
||||||
|
{
|
||||||
|
ptr = realloc (ptr, n);
|
||||||
|
|
||||||
|
if (!ptr)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "%s: Memory exhausted\n", program_name);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xsyslog (int priority, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
static int logfd_opened = 0;
|
||||||
|
|
||||||
|
if (!logfd_opened)
|
||||||
|
{
|
||||||
|
openlog (program_name, LOG_PID, LOG_FACILITY);
|
||||||
|
logfd_opened = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
vsyslog (priority, format, args);
|
||||||
|
va_end (args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Format and display MESSAGE on the standard error and send it to the
|
||||||
|
system logger. If ERRNUM is not 0, append the system error message
|
||||||
|
corresponding to ERRNUM to the output. If STATUS is not 0, exit with
|
||||||
|
an exit status of STATUS. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
dal_error (int status, int errnum, const char *message, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
size_t bufsize;
|
||||||
|
char *formatted_message;
|
||||||
|
|
||||||
|
fflush (stdout);
|
||||||
|
|
||||||
|
bufsize = strlen (message) * 2;
|
||||||
|
formatted_message = (char *) xmalloc (bufsize);
|
||||||
|
|
||||||
|
va_start (args, message);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
int printed;
|
||||||
|
printed = vsnprintf (formatted_message, bufsize, message, args);
|
||||||
|
|
||||||
|
if ((size_t) printed < bufsize)
|
||||||
|
break;
|
||||||
|
|
||||||
|
bufsize *= 2;
|
||||||
|
formatted_message = xrealloc (formatted_message, bufsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
if (errnum)
|
||||||
|
{
|
||||||
|
char *error_message = strerror (errnum);
|
||||||
|
|
||||||
|
formatted_message
|
||||||
|
= xrealloc (formatted_message,
|
||||||
|
(strlen (formatted_message)
|
||||||
|
+ strlen (error_message)
|
||||||
|
+ 3));
|
||||||
|
|
||||||
|
strcat (formatted_message, ": ");
|
||||||
|
strcat (formatted_message, error_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf (stderr, "%s: %s\n", program_name, formatted_message);
|
||||||
|
|
||||||
|
xsyslog (LOG_PRIORITY, "%s", formatted_message);
|
||||||
|
|
||||||
|
free (formatted_message);
|
||||||
|
fflush (stderr);
|
||||||
|
|
||||||
|
if (status)
|
||||||
|
{
|
||||||
|
closelog ();
|
||||||
|
exit (status);
|
||||||
|
}
|
||||||
|
}
|
||||||
147
contrib/shadow-anonftp.patch
Normal file
147
contrib/shadow-anonftp.patch
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
Hello Marek,
|
||||||
|
|
||||||
|
I have created a diffile against the 980403 release that adds
|
||||||
|
functionality to newusers for automatic handling of users with only
|
||||||
|
anonomous 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
BIN
contrib/udbachk.v012.tgz
Normal file
BIN
contrib/udbachk.v012.tgz
Normal file
Binary file not shown.
70
debian/FILES
vendored
Normal file
70
debian/FILES
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
groups
|
||||||
|
groups.1
|
||||||
|
id
|
||||||
|
id.1
|
||||||
|
pw_auth.3
|
||||||
|
scologin
|
||||||
|
shadow.3
|
||||||
|
sulogin
|
||||||
|
sulogin.8
|
||||||
|
login faillog
|
||||||
|
login faillog.5
|
||||||
|
login faillog.8
|
||||||
|
login lastlog
|
||||||
|
login lastlog.8
|
||||||
|
login login
|
||||||
|
login login.1
|
||||||
|
login login.access.5
|
||||||
|
login login.defs.5
|
||||||
|
login logoutd
|
||||||
|
login logoutd.8
|
||||||
|
login newgrp
|
||||||
|
login newgrp.1
|
||||||
|
login porttime.5
|
||||||
|
passwd chage
|
||||||
|
passwd chage.1
|
||||||
|
passwd chfn
|
||||||
|
passwd chfn.1
|
||||||
|
passwd chpasswd
|
||||||
|
passwd chpasswd.8
|
||||||
|
passwd chsh
|
||||||
|
passwd chsh.1
|
||||||
|
passwd dpasswd
|
||||||
|
passwd dpasswd.8
|
||||||
|
passwd expiry
|
||||||
|
passwd gpasswd
|
||||||
|
passwd gpasswd.1
|
||||||
|
passwd groupadd
|
||||||
|
passwd groupadd.8
|
||||||
|
passwd groupdel
|
||||||
|
passwd groupdel.8
|
||||||
|
passwd groupmod
|
||||||
|
passwd groupmod.8
|
||||||
|
passwd grpck
|
||||||
|
passwd grpck.8
|
||||||
|
passwd grpconv
|
||||||
|
passwd grpunconv
|
||||||
|
passwd mkpasswd
|
||||||
|
passwd mkpasswd.8
|
||||||
|
passwd newusers
|
||||||
|
passwd newusers.8
|
||||||
|
passwd passwd
|
||||||
|
passwd passwd.1
|
||||||
|
passwd passwd.5
|
||||||
|
passwd pwauth.8
|
||||||
|
passwd pwck
|
||||||
|
passwd pwck.8
|
||||||
|
passwd pwconv
|
||||||
|
passwd pwconv.8
|
||||||
|
passwd pwunconv
|
||||||
|
passwd pwunconv.8
|
||||||
|
passwd shadow.5
|
||||||
|
passwd useradd
|
||||||
|
passwd useradd.8
|
||||||
|
passwd userdel
|
||||||
|
passwd userdel.8
|
||||||
|
passwd usermod
|
||||||
|
passwd usermod.8
|
||||||
|
secure-su su
|
||||||
|
secure-su su.1
|
||||||
|
secure-su suauth.5
|
||||||
9
debian/Makefile.am
vendored
Normal file
9
debian/Makefile.am
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
EXTRA_DIST = FILES changelog checksums control login.conffiles \
|
||||||
|
login.copyright login.postinst login.postrm login.preinst \
|
||||||
|
login.prerm logoutd passwd.conffiles passwd.copyright \
|
||||||
|
passwd.postinst porttime rules secure-su.README \
|
||||||
|
secure-su.conffiles secure-su.copyright secure-su.postrm \
|
||||||
|
secure-su.preinst securetty tar.c
|
||||||
200
debian/Makefile.in
vendored
Normal file
200
debian/Makefile.in
vendored
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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.
|
||||||
|
|
||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
DISTDIR =
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = ..
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CATALOGS = @CATALOGS@
|
||||||
|
CATOBJEXT = @CATOBJEXT@
|
||||||
|
CC = @CC@
|
||||||
|
CPP = @CPP@
|
||||||
|
DATADIRNAME = @DATADIRNAME@
|
||||||
|
GENCAT = @GENCAT@
|
||||||
|
GMOFILES = @GMOFILES@
|
||||||
|
GMSGFMT = @GMSGFMT@
|
||||||
|
GT_NO = @GT_NO@
|
||||||
|
GT_YES = @GT_YES@
|
||||||
|
INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
|
||||||
|
INSTOBJEXT = @INSTOBJEXT@
|
||||||
|
INTLDEPS = @INTLDEPS@
|
||||||
|
INTLLIBS = @INTLLIBS@
|
||||||
|
INTLOBJS = @INTLOBJS@
|
||||||
|
LD = @LD@
|
||||||
|
LIBCRACK = @LIBCRACK@
|
||||||
|
LIBCRYPT = @LIBCRYPT@
|
||||||
|
LIBPAM = @LIBPAM@
|
||||||
|
LIBSKEY = @LIBSKEY@
|
||||||
|
LIBTCFS = @LIBTCFS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
|
MSGFMT = @MSGFMT@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
POFILES = @POFILES@
|
||||||
|
POSUB = @POSUB@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
U = @U@
|
||||||
|
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
||||||
|
USE_NLS = @USE_NLS@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
YACC = @YACC@
|
||||||
|
l = @l@
|
||||||
|
|
||||||
|
EXTRA_DIST = FILES changelog checksums control login.conffiles \
|
||||||
|
login.copyright login.postinst login.postrm login.preinst \
|
||||||
|
login.prerm logoutd passwd.conffiles passwd.copyright \
|
||||||
|
passwd.postinst porttime rules secure-su.README \
|
||||||
|
secure-su.conffiles secure-su.copyright secure-su.postrm \
|
||||||
|
secure-su.preinst securetty tar.c
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = ../config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
DIST_COMMON = Makefile.am Makefile.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
all: Makefile
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps debian/Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
|
|
||||||
|
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
|
||||||
|
subdir = debian
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
info:
|
||||||
|
dvi:
|
||||||
|
check: all
|
||||||
|
$(MAKE)
|
||||||
|
installcheck:
|
||||||
|
install-exec:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-exec install-data all
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs:
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean: mostlyclean-generic
|
||||||
|
|
||||||
|
clean: clean-generic mostlyclean
|
||||||
|
|
||||||
|
distclean: distclean-generic clean
|
||||||
|
-rm -f config.status
|
||||||
|
-rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-generic distclean
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
.PHONY: tags distdir info dvi installcheck install-exec install-data \
|
||||||
|
install uninstall all installdirs mostlyclean-generic distclean-generic \
|
||||||
|
clean-generic maintainer-clean-generic clean mostlyclean distclean \
|
||||||
|
maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
175
debian/changelog
vendored
Normal file
175
debian/changelog
vendored
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
shadow (19990709) unstable; urgency=low
|
||||||
|
|
||||||
|
* upstream upgrade, see CHANGES for more details. Note: this is
|
||||||
|
not the official Debian changelog entry - it is here only for
|
||||||
|
dpkg-buildpackage to work (so I can build and test this package
|
||||||
|
on my system). To the Debian maintainers: please feel free to
|
||||||
|
replace this entry with your own, and put your name (instead of
|
||||||
|
mine) in the debian/control Maintainer field. Thanks, and keep
|
||||||
|
up the good work!
|
||||||
|
|
||||||
|
-- Marek Michalkiewicz <marekm@linux.org.pl> Fri, 9 Jul 1999 19:40:00 +0200
|
||||||
|
|
||||||
|
shadow (980403-0.3.2) unstable; urgency=low
|
||||||
|
|
||||||
|
* configure.in patched for utmpx.h (for arm)
|
||||||
|
|
||||||
|
-- Jim Pick <jim@jimpick.com> Sun, 4 Oct 1998 19:06:15 -0700
|
||||||
|
|
||||||
|
shadow (980403-0.3.1) frozen unstable; urgency=low
|
||||||
|
|
||||||
|
* Non maintainer upload.
|
||||||
|
changes.{guess,sub} changed to recognize a Arm architecture.
|
||||||
|
|
||||||
|
-- Turbo Fredriksson <turbo@debian.org> Fri, 14 Aug 1998 22:37:58 -0400
|
||||||
|
|
||||||
|
shadow (980403-0.3) frozen unstable; urgency=high
|
||||||
|
|
||||||
|
* Non maintainer upload.
|
||||||
|
* src/login.c: Applied patch from <marekm@i17linuxb.ists.pwr.wroc.pl> to
|
||||||
|
fix security hole of login not checking the return code from setgid(),
|
||||||
|
initgroups() or setuid(). [#24710]
|
||||||
|
|
||||||
|
-- James Troup <james@nocrew.org> Fri, 17 Jul 1998 18:56:31 +0100
|
||||||
|
|
||||||
|
shadow (980403-0.2) frozen unstable; urgency=low
|
||||||
|
|
||||||
|
* (login.defs): fixed UMASK
|
||||||
|
(thanks to James Troup for noticing my screwup :)
|
||||||
|
* Pruned non-Debian changelog entries.
|
||||||
|
|
||||||
|
-- Joel Klecker <jk@espy.org> Mon, 11 May 1998 11:25:22 -0700
|
||||||
|
|
||||||
|
shadow (980403-0.1) frozen unstable; urgency=low
|
||||||
|
|
||||||
|
* Non-maintainer release.
|
||||||
|
* New upstream release (18225).
|
||||||
|
* (debian/login.postinst)
|
||||||
|
* Use 'touch' instead of 'cat >' when creating /var/log/faillog
|
||||||
|
(15998,16187,21687).
|
||||||
|
* No longer fails if no previous configured version exists (11433).
|
||||||
|
* (gpasswd): now checks which user invoked it before calling setuid() (18132).
|
||||||
|
* (debian/passwd.postinst): removed bashism (13753).
|
||||||
|
* (groupmod): NULL dereference fixed upstream, as a result, it no longer
|
||||||
|
dumps core when changing group name (16893,17894).
|
||||||
|
* (useradd): no longer segfaults if /etc/default/useradd is missing (18628).
|
||||||
|
* (login.defs.1): now documents more options (13485).
|
||||||
|
* (source): includes 'missing' (13815,18133,21280).
|
||||||
|
* (login.1):
|
||||||
|
* Removed mention of "d_passwd(5)", which doesn't exist,
|
||||||
|
and login.defs.5 now documents /etc/dialups (15176).
|
||||||
|
* Added /etc/nologin to FILES section and reference nologin(5) (21695).
|
||||||
|
* The URL mentioned in Bug#15391 is no longer valid.
|
||||||
|
* (login.defs): no longer sets ULIMIT (17529).
|
||||||
|
* (login):
|
||||||
|
* No longer uses static buffers for group lines (17532).
|
||||||
|
* Doesn't seem to make assumptions about gid_t any longer (21767).
|
||||||
|
* (faillog.8): s-/usr/adm-/var/log-g (19974).
|
||||||
|
* (lastlog.8): notes that "some systems" use /var/log instead of
|
||||||
|
/usr/adm (21746).
|
||||||
|
* Install upstream changelog as 'changelog.gz' as per policy (20052).
|
||||||
|
* (secure-su): Changed /etc/suauth to reference the group 'root'
|
||||||
|
instead of 'wheel' (17593).
|
||||||
|
|
||||||
|
-- Joel Klecker <jk@espy.org> Thu, 30 Apr 1998 18:32:12 -0700
|
||||||
|
|
||||||
|
shadow (970616-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* Upstream upgrade.
|
||||||
|
* chage works (10561).
|
||||||
|
* Fix NIS behavior (5634,8734,10032,10545,10984,11160,12064).
|
||||||
|
* Wrote pwconv,pwunconv,grpconv,grpunconv manpage (10940).
|
||||||
|
* vipw fixes (10521,10696,11618,11924,12184,13001)
|
||||||
|
* Fixes for new automake.
|
||||||
|
* Compile with glibc2. (8627,8777,9824,11713,11719,12082,12108,11442).
|
||||||
|
* debian/rules fixes (8876,12468).
|
||||||
|
* /etc/login.defs: UMASK=002 (9102).
|
||||||
|
* chown /dev/vcs* on login (9421,13255).
|
||||||
|
* Added tty9-tty12 to /etc/securetty (11644).
|
||||||
|
* Provide template and manpage for /etc/limits (12289).
|
||||||
|
* Fix security hole in postinst (11769).
|
||||||
|
* login fills out ut_addr field in utmp (10701).
|
||||||
|
* shadowconfig.sh fixes (9189,9328,9386,10968,12452,12469).
|
||||||
|
* Overcome postinst bug in old shadow-passwd package (9939,12120).
|
||||||
|
* useradd default GROUP=100 (9244).
|
||||||
|
* Allow 8 bit chars in chfn (12367).
|
||||||
|
* secure-su - set HOME, use SHELL if set (11003,11189).
|
||||||
|
|
||||||
|
-- Guy Maor <maor@ece.utexas.edu> Fri, 26 Sep 1997 19:23:42 -0500
|
||||||
|
|
||||||
|
shadow (970616) unstable; urgency=low
|
||||||
|
|
||||||
|
* vipw preserves permissions on edited files (10521).
|
||||||
|
* various other bug fixes.
|
||||||
|
|
||||||
|
-- Marek Michalkiewicz <marekm@piast.t19.ds.pwr.wroc.pl> Mon, 16 Jun 1997 02:02:00 +0200
|
||||||
|
|
||||||
|
shadow (970601) unstable; urgency=low
|
||||||
|
|
||||||
|
* Fix typo in libmisc/mail.c causing login to segfault.
|
||||||
|
|
||||||
|
-- Marek Michalkiewicz <marekm@piast.t19.ds.pwr.wroc.pl> Mon, 2 Jun 1997 07:33:00 +0200
|
||||||
|
|
||||||
|
shadow (970502-2) unstable; urgency=low
|
||||||
|
|
||||||
|
* Fixes to shadow group support (grpconv didn't work).
|
||||||
|
|
||||||
|
-- Marek Michalkiewicz <marekm@piast.t19.ds.pwr.wroc.pl> Fri, 2 May 1997 15:48:00 +0200
|
||||||
|
|
||||||
|
shadow (970502-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* Upstream upgrade.
|
||||||
|
|
||||||
|
-- Marek Michalkiewicz <marekm@piast.t19.ds.pwr.wroc.pl> Fri, 2 May 1997 03:18:00 +0200
|
||||||
|
|
||||||
|
shadow (961025-2) frozen unstable; urgency=medium
|
||||||
|
|
||||||
|
* Fix useradd -D segfault (8098, 8152, 8733).
|
||||||
|
* Fix shadowconfig - permfix only on xlock; /etc/init.d/xdm rewrite, chmod
|
||||||
|
(8102, 8320, 8333, 8708).
|
||||||
|
* Remove HOWTO from usr/doc/passwd as it's in linux-doc (8150).
|
||||||
|
* Fixes to su.1 (8153).
|
||||||
|
* login, passwd, su each conflict and replace with the old shadow-*
|
||||||
|
version. (8269, 8290, 8393, 8394).
|
||||||
|
* Put /etc/shells back in passwd (8328).
|
||||||
|
* Fixed login.postinst for upgrade from shadow-login (8392).
|
||||||
|
* Added -e to pwck for use in shadowconfig: reports only errors, no
|
||||||
|
warnings (8542).
|
||||||
|
* Wrote shadowconfig.8 (8588).
|
||||||
|
|
||||||
|
-- Guy Maor <maor@ece.utexas.edu> Sat, 19 Apr 1997 02:34:59 -0500
|
||||||
|
|
||||||
|
shadow (961025-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* Upstream upgrade, new source format.
|
||||||
|
|
||||||
|
-- Guy Maor <maor@ece.utexas.edu> Mon, 10 Feb 1997 02:56:56 -0600
|
||||||
|
|
||||||
|
shadow (960530-1) experimental; urgency=LOW
|
||||||
|
|
||||||
|
* Added grpunconv script
|
||||||
|
* Changed prerm/postinst scripts to remove/create shadowed group
|
||||||
|
file
|
||||||
|
* Added vipw/vigr binaries
|
||||||
|
* Renamed package to shadow-passwd
|
||||||
|
* Added packages shadow-su and shadow-login
|
||||||
|
* Added 'Essential: yes' to be able to replace passwd and login
|
||||||
|
* Section now base for shadow-passwd and shadow-login
|
||||||
|
* Added /etc/shell conffile
|
||||||
|
* Added /etc/securetty conffile
|
||||||
|
* Added new conffile /etc/suauth. Set it up so only users in group 0
|
||||||
|
can su to root.
|
||||||
|
|
||||||
|
shadow (960810-1) base; urgency=LOW
|
||||||
|
|
||||||
|
* Added useradd default file so that default group is no longer 1
|
||||||
|
* Also corrected the useradd manpage
|
||||||
|
* Replaced grpunconv script by real binary which does correct
|
||||||
|
locking.
|
||||||
|
* Added 'source' field control file to control files
|
||||||
|
* Changed version naming in debian.rules
|
||||||
|
* New upstream version
|
||||||
|
|
||||||
|
Local variables:
|
||||||
|
mode: debian-changelog
|
||||||
|
End:
|
||||||
7
debian/checksums
vendored
Executable file
7
debian/checksums
vendored
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# This script is run from debian/rules to generate MD5 checksums
|
||||||
|
# for all files in the package.
|
||||||
|
# $Id: checksums,v 1.1 1997/12/14 21:05:37 marekm Exp $
|
||||||
|
set -e
|
||||||
|
cd $1
|
||||||
|
md5sum `find * -type f ! -regex "DEBIAN/.*"` >DEBIAN/md5sums </dev/null
|
||||||
41
debian/control
vendored
Normal file
41
debian/control
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
Source: shadow
|
||||||
|
Section: base
|
||||||
|
Priority: required
|
||||||
|
Maintainer: Marek Michalkiewicz <marekm@linux.org.pl>
|
||||||
|
Standards-Version: 2.3.0.0
|
||||||
|
|
||||||
|
Package: login
|
||||||
|
Architecture: any
|
||||||
|
Pre-Depends: ${shlibs:Depends}
|
||||||
|
Conflicts: shadow-login
|
||||||
|
Replaces: shadow-login, shadow-passwd
|
||||||
|
Essential: yes
|
||||||
|
Section: base
|
||||||
|
Priority: required
|
||||||
|
Description: Sign on to the system.
|
||||||
|
login and newgrp change the user and group.
|
||||||
|
|
||||||
|
Package: passwd
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, login (>= 970502-1)
|
||||||
|
Conflicts: shadow-passwd
|
||||||
|
Replaces: shadow-passwd
|
||||||
|
Replaces: manpages (<=1.15-2)
|
||||||
|
Section: base
|
||||||
|
Priority: required
|
||||||
|
Description: Change and administer password and group data.
|
||||||
|
This package includes passwd, chsh, chfn, and many other programs to
|
||||||
|
maintain password and group data.
|
||||||
|
.
|
||||||
|
Shadow passwords are supported. See /usr/doc/passwd/README.Debian
|
||||||
|
|
||||||
|
Package: secure-su
|
||||||
|
Architecture: any
|
||||||
|
Depends: ${shlibs:Depends}, login (>= 970502-1)
|
||||||
|
Conflicts: shadow-su
|
||||||
|
Replaces: shadow-su
|
||||||
|
Section: admin
|
||||||
|
Priority: optional
|
||||||
|
Description: su with more security options
|
||||||
|
secure-su offers more security options than the normal su, such as a
|
||||||
|
wheel group, and from-user and to-user specific restrictions.
|
||||||
6
debian/login.conffiles
vendored
Normal file
6
debian/login.conffiles
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/etc/login.defs
|
||||||
|
/etc/login.access
|
||||||
|
/etc/securetty
|
||||||
|
/etc/porttime
|
||||||
|
/etc/limits
|
||||||
|
/etc/init.d/logoutd
|
||||||
76
debian/login.copyright
vendored
Normal file
76
debian/login.copyright
vendored
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
This is Debian/GNU Linux's prepackaged version of login and related
|
||||||
|
utilities.
|
||||||
|
|
||||||
|
It was downloaded from: <ftp://ftp.ists.pwr.wroc.pl/pub/linux/shadow/>.
|
||||||
|
|
||||||
|
This software is copyright 1988 - 1994, Julianne Frances Haugh.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. Neither the name of Julianne F. Haugh nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY JULIE HAUGH AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL JULIE HAUGH OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
|
This source code is currently archived on ftp.uu.net in the
|
||||||
|
comp.sources.misc portion of the USENET archives. You may also contact
|
||||||
|
the author, Julianne F. Haugh, at jfh@bga.com if you have
|
||||||
|
any questions regarding this package.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS BEING DISTRIBUTED AS-IS. THE AUTHORS DISCLAIM ALL
|
||||||
|
LIABILITY FOR ANY CONSEQUENCES OF USE. THE USER IS SOLELY RESPONSIBLE
|
||||||
|
FOR THE MAINTENANCE OF THIS SOFTWARE PACKAGE. THE AUTHORS ARE UNDER NO
|
||||||
|
OBLIGATION TO PROVIDE MODIFICATIONS OR IMPROVEMENTS. THE USER IS
|
||||||
|
ENCOURAGED TO TAKE ANY AND ALL STEPS NEEDED TO PROTECT AGAINST ACCIDENTAL
|
||||||
|
LOSS OF INFORMATION OR MACHINE RESOURCES.
|
||||||
|
|
||||||
|
Special thanks are due to Chip Rosenthal for his fine testing efforts;
|
||||||
|
to Steve Simmons for his work in porting this code to BSD; and to Bill
|
||||||
|
Kennedy for his contributions of LaserJet printer time and energies.
|
||||||
|
Also, thanks for Dennis L. Mumaugh for the initial shadow password
|
||||||
|
information and to Tony Walton (olapw@olgb1.oliv.co.uk) for the System
|
||||||
|
V Release 4 changes. Effort in porting to SunOS has been contributed
|
||||||
|
by Dr. Michael Newberry (miken@cs.adfa.oz.au) and Micheal J. Miller, Jr.
|
||||||
|
(mke@kaberd.rain.com). Effort in porting to AT&T UNIX System V Release
|
||||||
|
4 has been provided by Andrew Herbert (andrew@werple.pub.uu.oz.au).
|
||||||
|
Special thanks to Marek Michalkiewicz (marekm@i17linuxb.ists.pwr.wroc.pl)
|
||||||
|
for taking over the Linux port of this software.
|
||||||
|
|
||||||
|
Source files: login_access.c, login_desrpc.c, login_krb.c are derived
|
||||||
|
from the logdaemon-5.0 package, which is under the following license:
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* Copyright 1995 by Wietse Venema. All rights reserved. Individual files
|
||||||
|
* may be covered by other copyrights (as noted in the file itself.)
|
||||||
|
*
|
||||||
|
* This material was originally written and compiled by Wietse Venema at
|
||||||
|
* Eindhoven University of Technology, The Netherlands, in 1990, 1991,
|
||||||
|
* 1992, 1993, 1994 and 1995.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms are permitted
|
||||||
|
* provided that this entire copyright notice is duplicated in all such
|
||||||
|
* copies.
|
||||||
|
*
|
||||||
|
* This software is provided "as is" and without any expressed or implied
|
||||||
|
* warranties, including, without limitation, the implied warranties of
|
||||||
|
* merchantibility and fitness for any particular purpose.
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
42
debian/login.postinst
vendored
Normal file
42
debian/login.postinst
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
[ "$1" = configure -a "$2" ] \
|
||||||
|
&& dpkg --compare-versions $2 lt 961025 \
|
||||||
|
|| [ -z "$2" ] \
|
||||||
|
|| exit 0
|
||||||
|
|
||||||
|
if [ -f /etc/usertty ] ; then
|
||||||
|
cat > /etc/usertty$$ <<EOF
|
||||||
|
# WARNING: This file isn't used by the current version of login.
|
||||||
|
# Similiar functionality is available in /etc/login.defs,
|
||||||
|
# /etc/login.access, and /etc/porttime. See login.defs(5),
|
||||||
|
# login.access(5), and porttime(5) for details. You may safely remove
|
||||||
|
# this file after configuring the other three.
|
||||||
|
#
|
||||||
|
EOF
|
||||||
|
cat /etc/usertty >> /etc/usertty$$
|
||||||
|
mv -f /etc/usertty$$ /etc/usertty
|
||||||
|
|
||||||
|
if egrep -vqn '^#|^ *$' /etc/usertty ; then cat <<EOF
|
||||||
|
You've configured /etc/usertty, but the current version of login no
|
||||||
|
longer supports it. Similiar functionality is available in other
|
||||||
|
files, which you will have to configure for your purposes.
|
||||||
|
|
||||||
|
A more detailed explanation has been prepended to /etc/usertty.
|
||||||
|
You'll have to do some configuration later.
|
||||||
|
|
||||||
|
Please hit return to confirm.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
read
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f /var/log/faillog ] ; then
|
||||||
|
touch /var/log/faillog
|
||||||
|
chown root:root /var/log/faillog
|
||||||
|
chmod 644 /var/log/faillog
|
||||||
|
fi
|
||||||
|
|
||||||
|
update-rc.d logoutd defaults > /dev/null
|
||||||
6
debian/login.postrm
vendored
Normal file
6
debian/login.postrm
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ $1 = purge ]; then
|
||||||
|
update-rc.d logoutd remove >/dev/null
|
||||||
|
fi
|
||||||
4
debian/login.preinst
vendored
Normal file
4
debian/login.preinst
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
dpkg --assert-support-predepends ||
|
||||||
|
( echo -e "\nPlease upgrade to a newer version of dpkg\n"; exit 1; )
|
||||||
8
debian/login.prerm
vendored
Normal file
8
debian/login.prerm
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
remove|upgrade|deconfigure)
|
||||||
|
/etc/init.d/logoutd stop
|
||||||
|
;;
|
||||||
|
esac
|
||||||
42
debian/logoutd
vendored
Normal file
42
debian/logoutd
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# start/stop logoutd
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
DAEMON=/usr/sbin/logoutd
|
||||||
|
test -f $DAEMON || exit 0
|
||||||
|
|
||||||
|
# Most people won't need logoutd(8) running, so we'll only run it if
|
||||||
|
# /etc/porttime has non-comment lines.
|
||||||
|
egrep -vq '^#|^ *$' /etc/porttime || exit 0
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
echo -n "Starting login time and port restriction enforcer: logoutd"
|
||||||
|
start-stop-daemon --start --quiet --exec $DAEMON
|
||||||
|
echo "."
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo -n "Stopping login time and port restriction enforcer: logoutd"
|
||||||
|
start-stop-daemon --stop --quiet --exec $DAEMON
|
||||||
|
echo "."
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
$0 stop
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
reload)
|
||||||
|
echo -n "Reloading logoutd configuration..."
|
||||||
|
start-stop-daemon --stop --signal 1 --quiet --exec $DAEMON
|
||||||
|
echo "done."
|
||||||
|
;;
|
||||||
|
force-reload)
|
||||||
|
$0 reload
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: /etc/init.d/logoutd start|stop"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
||||||
1
debian/passwd.conffiles
vendored
Normal file
1
debian/passwd.conffiles
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/etc/shells
|
||||||
55
debian/passwd.copyright
vendored
Normal file
55
debian/passwd.copyright
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
This is Debian/GNU Linux's prepackaged version of the passwd
|
||||||
|
utilities.
|
||||||
|
|
||||||
|
It was downloaded from: <ftp://ftp.ists.pwr.wroc.pl/pub/linux/shadow/>.
|
||||||
|
|
||||||
|
This software is copyright 1988 - 1994, Julianne Frances Haugh.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. Neither the name of Julianne F. Haugh nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY JULIE HAUGH AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL JULIE HAUGH OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
|
This source code is currently archived on ftp.uu.net in the
|
||||||
|
comp.sources.misc portion of the USENET archives. You may also contact
|
||||||
|
the author, Julianne F. Haugh, at jfh@bga.com if you have
|
||||||
|
any questions regarding this package.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS BEING DISTRIBUTED AS-IS. THE AUTHORS DISCLAIM ALL
|
||||||
|
LIABILITY FOR ANY CONSEQUENCES OF USE. THE USER IS SOLELY RESPONSIBLE
|
||||||
|
FOR THE MAINTENANCE OF THIS SOFTWARE PACKAGE. THE AUTHORS ARE UNDER NO
|
||||||
|
OBLIGATION TO PROVIDE MODIFICATIONS OR IMPROVEMENTS. THE USER IS
|
||||||
|
ENCOURAGED TO TAKE ANY AND ALL STEPS NEEDED TO PROTECT AGAINST ACCIDENTAL
|
||||||
|
LOSS OF INFORMATION OR MACHINE RESOURCES.
|
||||||
|
|
||||||
|
Special thanks are due to Chip Rosenthal for his fine testing efforts;
|
||||||
|
to Steve Simmons for his work in porting this code to BSD; and to Bill
|
||||||
|
Kennedy for his contributions of LaserJet printer time and energies.
|
||||||
|
Also, thanks for Dennis L. Mumaugh for the initial shadow password
|
||||||
|
information and to Tony Walton (olapw@olgb1.oliv.co.uk) for the System
|
||||||
|
V Release 4 changes. Effort in porting to SunOS has been contributed
|
||||||
|
by Dr. Michael Newberry (miken@cs.adfa.oz.au) and Micheal J. Miller, Jr.
|
||||||
|
(mke@kaberd.rain.com). Effort in porting to AT&T UNIX System V Release
|
||||||
|
4 has been provided by Andrew Herbert (andrew@werple.pub.uu.oz.au).
|
||||||
|
Special thanks to Marek Michalkiewicz (marekm@i17linuxb.ists.pwr.wroc.pl)
|
||||||
|
for taking over the Linux port of this software.
|
||||||
38
debian/passwd.postinst
vendored
Normal file
38
debian/passwd.postinst
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ configure != "$1" ] ; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# passwd 961025-1 incorrectly did permfix on sulogin and xdm-shadow in
|
||||||
|
# shadowconfig
|
||||||
|
permfix () {
|
||||||
|
[ -f $1 ] || return 0
|
||||||
|
chown root:root $1
|
||||||
|
chmod 755 $1
|
||||||
|
}
|
||||||
|
permfix /sbin/sulogin
|
||||||
|
permfix /usr/X11R6/bin/xdm-shadow
|
||||||
|
|
||||||
|
grep -q '^shadow:[^:]*:42' /etc/group && exit 0
|
||||||
|
groupadd -g 42 shadow || (
|
||||||
|
cat <<EOF
|
||||||
|
Group ID 42 has been relegated for the shadow group. You have either
|
||||||
|
used 42 yourself or created a shadow group with a different ID.
|
||||||
|
Please correct this problem and reconfigure with ``dpkg --configure passwd''.
|
||||||
|
|
||||||
|
Note that both user and group IDs in the range 0-99 are globally
|
||||||
|
allocated by the Debian project and must be the same on every Debian
|
||||||
|
system.
|
||||||
|
EOF
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
)
|
||||||
|
|
||||||
|
# overcome bug in old shadow-passwd postinst; these are harmless on other
|
||||||
|
# systems
|
||||||
|
chmod 644 /etc/passwd /etc/group
|
||||||
|
chown root:root /etc/passwd /etc/group
|
||||||
|
|
||||||
|
exit 0
|
||||||
8
debian/porttime
vendored
Normal file
8
debian/porttime
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# /etc/porttime contains user time restrictions.
|
||||||
|
# See porttime(5).
|
||||||
|
|
||||||
|
# If you add restrictions to this file, be sure that
|
||||||
|
# PORTTIME_CHECKS_ENAB is set to `yes' in /etc/login.defs. logoutd(8)
|
||||||
|
# will be started automatically on bootup if this file contains
|
||||||
|
# non-comment lines. You may also start it manually with
|
||||||
|
# `/etc/init.d/logoutd start'.
|
||||||
135
debian/rules
vendored
Executable file
135
debian/rules
vendored
Executable file
@@ -0,0 +1,135 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
package = shadow
|
||||||
|
|
||||||
|
# set up environment so that dpkg --build runs our tar wrapper
|
||||||
|
TAR_WRAPPER_SETUP = REAL_TAR=`command -p -v tar` PATH=`cd debian && pwd`:$$PATH
|
||||||
|
|
||||||
|
# for "exec login" to work for ordinary users, /bin/login needs to be setuid
|
||||||
|
# but very few people use this feature, so we make it non-setuid by default
|
||||||
|
LOGIN_PERM = 0755
|
||||||
|
|
||||||
|
build:
|
||||||
|
$(checkdir)
|
||||||
|
# shared lib support is untested, so...
|
||||||
|
./configure --disable-shared --disable-desrpc # --without-libcrack
|
||||||
|
$(MAKE)
|
||||||
|
gcc -O2 -Wall -o debian/tar debian/tar.c
|
||||||
|
touch build
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(checkdir)
|
||||||
|
rm -f build debian/tar
|
||||||
|
-$(MAKE) -i distclean
|
||||||
|
rm -rf {libmisc,lib,src}/.deps
|
||||||
|
rm -rf debian/tmp{-l,-p,-s} debian/{files*,substvars}
|
||||||
|
find . -name '*~' -print0 | xargs -0 rm -f
|
||||||
|
|
||||||
|
binary-indep: checkroot build
|
||||||
|
$(checkdir)
|
||||||
|
|
||||||
|
binary-arch: binary-login binary-passwd binary-su
|
||||||
|
|
||||||
|
binary-login: checkroot build
|
||||||
|
$(checkdir)
|
||||||
|
-rm -rf debian/tmp-l
|
||||||
|
install -d debian/tmp-l/{DEBIAN,bin,etc/init.d,usr/{bin,man/man{1,5,8},doc/login,sbin}}
|
||||||
|
install -s -m$(LOGIN_PERM) src/login debian/tmp-l/bin/
|
||||||
|
install -s -m4755 src/newgrp debian/tmp-l/usr/bin/
|
||||||
|
install -s src/{faillog,lastlog} debian/tmp-l/usr/bin/
|
||||||
|
install -s src/logoutd debian/tmp-l/usr/sbin/
|
||||||
|
install -m644 man/{login.1,newgrp.1} debian/tmp-l/usr/man/man1/
|
||||||
|
install -m644 man/{login.defs.5,login.access.5,porttime.5,faillog.5,limits.5} debian/tmp-l/usr/man/man5/
|
||||||
|
install -m644 man/{faillog.8,logoutd.8,lastlog.8} debian/tmp-l/usr/man/man8/
|
||||||
|
ln -s newgrp debian/tmp-l/usr/bin/sg
|
||||||
|
ln -s newgrp.1.gz debian/tmp-l/usr/man/man1/sg.1.gz
|
||||||
|
install -m600 etc/login.defs.linux debian/tmp-l/etc/login.defs
|
||||||
|
install -m600 etc/{login.access,limits} debian/{securetty,porttime} debian/tmp-l/etc/
|
||||||
|
install debian/logoutd debian/tmp-l/etc/init.d/
|
||||||
|
install -m644 debian/changelog debian/tmp-l/usr/doc/login/changelog.Debian
|
||||||
|
install -m644 doc/CHANGES debian/tmp-l/usr/doc/login/changelog
|
||||||
|
find debian/tmp-l/usr/{doc,man} -type f | xargs gzip -9
|
||||||
|
install -m644 debian/login.copyright debian/tmp-l/usr/doc/login/copyright
|
||||||
|
install debian/login.preinst debian/tmp-l/DEBIAN/preinst
|
||||||
|
install debian/login.postinst debian/tmp-l/DEBIAN/postinst
|
||||||
|
install debian/login.prerm debian/tmp-l/DEBIAN/prerm
|
||||||
|
install debian/login.postrm debian/tmp-l/DEBIAN/postrm
|
||||||
|
install -m644 debian/login.conffiles debian/tmp-l/DEBIAN/conffiles
|
||||||
|
dpkg-shlibdeps debian/tmp-l/{bin/*,usr/bin/*,usr/sbin/*}
|
||||||
|
dpkg-gencontrol -isp -plogin -Pdebian/tmp-l
|
||||||
|
./debian/checksums debian/tmp-l
|
||||||
|
$(TAR_WRAPPER_SETUP) dpkg --build debian/tmp-l ..
|
||||||
|
|
||||||
|
binary-passwd: checkroot build
|
||||||
|
$(checkdir)
|
||||||
|
-rm -rf debian/tmp-p
|
||||||
|
install -d debian/tmp-p/{DEBIAN,etc,usr/{sbin,bin,man/{man1,man5,man8},doc/passwd}}
|
||||||
|
install -m644 etc/shells debian/tmp-p/etc/
|
||||||
|
install -s -m4755 src/{chage,chfn,chsh,expiry,gpasswd,passwd} debian/tmp-p/usr/bin/
|
||||||
|
install -s src/{chpasswd,groupadd,groupdel,groupmod,grpck,grpconv,grpunconv} \
|
||||||
|
src/{newusers,pwck,pwconv,pwunconv,useradd,userdel} \
|
||||||
|
src/{dpasswd,usermod,vipw} debian/tmp-p/usr/sbin/
|
||||||
|
install -m644 man/{chage.1,chfn.1,chsh.1,gpasswd.1,passwd.1} \
|
||||||
|
debian/tmp-p/usr/man/man1/
|
||||||
|
install -m644 man/{chpasswd.8,groupadd.8,groupdel.8,groupmod.8,grpck.8} \
|
||||||
|
man/{newusers.8,pwck.8,dpasswd.8} \
|
||||||
|
man/{useradd.8,userdel.8,usermod.8,vipw.8,shadowconfig.8,pwconv.8} \
|
||||||
|
debian/tmp-p/usr/man/man8/
|
||||||
|
install -m644 man/{passwd.5,shadow.5} debian/tmp-p/usr/man/man5/
|
||||||
|
ln -s vipw debian/tmp-p/usr/sbin/vigr
|
||||||
|
ln -s vipw.8.gz debian/tmp-p/usr/man/man8/vigr.8.gz
|
||||||
|
for i in pwunconv.8.gz grpconv.8.gz grpunconv.8.gz ; do \
|
||||||
|
ln -s pwconv.8.gz debian/tmp-p/usr/man/man8/$$i ; done
|
||||||
|
install -m644 debian/changelog debian/tmp-p/usr/doc/passwd/changelog.Debian
|
||||||
|
install -m644 doc/{CHANGES,README,README.limits,README.linux,README.debian} \
|
||||||
|
debian/tmp-p/usr/doc/passwd/
|
||||||
|
find debian/tmp-p/usr/{doc,man} -type f | xargs gzip -9f
|
||||||
|
install -m644 debian/passwd.copyright debian/tmp-p/usr/doc/passwd/copyright
|
||||||
|
install debian/login.preinst debian/tmp-p/DEBIAN/preinst
|
||||||
|
install debian/passwd.postinst debian/tmp-p/DEBIAN/postinst
|
||||||
|
install -m644 debian/passwd.conffiles debian/tmp-p/DEBIAN/conffiles
|
||||||
|
dpkg-shlibdeps debian/tmp-p/usr/{bin/*,sbin/*}
|
||||||
|
# dpkg-shlibdeps fails on scripts, so install them now...
|
||||||
|
install src/shadowconfig.sh debian/tmp-p/usr/sbin/shadowconfig
|
||||||
|
dpkg-gencontrol -isp -ppasswd -Pdebian/tmp-p
|
||||||
|
./debian/checksums debian/tmp-p
|
||||||
|
$(TAR_WRAPPER_SETUP) dpkg --build debian/tmp-p ..
|
||||||
|
|
||||||
|
binary-su: checkroot build
|
||||||
|
$(checkdir)
|
||||||
|
-rm -rf debian/tmp-s
|
||||||
|
install -d debian/tmp-s/{DEBIAN,etc,bin,usr/{doc/secure-su,man/man{1,5}}}
|
||||||
|
install -s -m4755 src/su debian/tmp-s/bin/
|
||||||
|
install -m644 etc/suauth debian/tmp-s/etc/
|
||||||
|
install -m644 man/suauth.5 debian/tmp-s/usr/man/man5/
|
||||||
|
install -m644 man/su.1 debian/tmp-s/usr/man/man1/
|
||||||
|
install -m644 debian/secure-su.README debian/tmp-s/usr/doc/secure-su/README
|
||||||
|
install -m644 debian/changelog debian/tmp-s/usr/doc/secure-su/
|
||||||
|
find debian/tmp-s/usr/{doc,man} -type f | xargs gzip -9f
|
||||||
|
install -m644 debian/secure-su.copyright debian/tmp-s/usr/doc/secure-su/copyright
|
||||||
|
install debian/secure-su.preinst debian/tmp-s/DEBIAN/preinst
|
||||||
|
install debian/secure-su.postrm debian/tmp-s/DEBIAN/postrm
|
||||||
|
install -m644 debian/secure-su.conffiles debian/tmp-s/DEBIAN/conffiles
|
||||||
|
dpkg-shlibdeps debian/tmp-s/bin/su
|
||||||
|
dpkg-gencontrol -isp -psecure-su -Pdebian/tmp-s
|
||||||
|
./debian/checksums debian/tmp-s
|
||||||
|
$(TAR_WRAPPER_SETUP) dpkg --build debian/tmp-s ..
|
||||||
|
|
||||||
|
define checkdir
|
||||||
|
test -f lib/shadow.c -a -f debian/rules
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
binary: binary-indep binary-arch
|
||||||
|
|
||||||
|
source diff:
|
||||||
|
@echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
|
||||||
|
|
||||||
|
checkroot:
|
||||||
|
$(checkdir)
|
||||||
|
# test root = "`whoami`"
|
||||||
|
|
||||||
|
.PHONY: binary binary-arch binary-indep clean checkroot
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode:Makefile
|
||||||
4
debian/secure-su.README
vendored
Normal file
4
debian/secure-su.README
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
The su from shellutils is diverted into /bin/secure-su. That
|
||||||
|
directory MUST be owned by root and have permissions 700. Otherwise
|
||||||
|
you will lost any security advantages you will gain by installing
|
||||||
|
secure-su as users can still invoke the old su.
|
||||||
1
debian/secure-su.conffiles
vendored
Normal file
1
debian/secure-su.conffiles
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/etc/suauth
|
||||||
54
debian/secure-su.copyright
vendored
Normal file
54
debian/secure-su.copyright
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
This is Debian/GNU Linux's prepackaged version of secure-su.
|
||||||
|
|
||||||
|
It was downloaded from: <ftp://ftp.ists.pwr.wroc.pl/pub/linux/shadow/>.
|
||||||
|
|
||||||
|
This software is copyright 1988 - 1994, Julianne Frances Haugh.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. Neither the name of Julianne F. Haugh nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY JULIE HAUGH AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL JULIE HAUGH OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
|
This source code is currently archived on ftp.uu.net in the
|
||||||
|
comp.sources.misc portion of the USENET archives. You may also contact
|
||||||
|
the author, Julianne F. Haugh, at jfh@bga.com if you have
|
||||||
|
any questions regarding this package.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS BEING DISTRIBUTED AS-IS. THE AUTHORS DISCLAIM ALL
|
||||||
|
LIABILITY FOR ANY CONSEQUENCES OF USE. THE USER IS SOLELY RESPONSIBLE
|
||||||
|
FOR THE MAINTENANCE OF THIS SOFTWARE PACKAGE. THE AUTHORS ARE UNDER NO
|
||||||
|
OBLIGATION TO PROVIDE MODIFICATIONS OR IMPROVEMENTS. THE USER IS
|
||||||
|
ENCOURAGED TO TAKE ANY AND ALL STEPS NEEDED TO PROTECT AGAINST ACCIDENTAL
|
||||||
|
LOSS OF INFORMATION OR MACHINE RESOURCES.
|
||||||
|
|
||||||
|
Special thanks are due to Chip Rosenthal for his fine testing efforts;
|
||||||
|
to Steve Simmons for his work in porting this code to BSD; and to Bill
|
||||||
|
Kennedy for his contributions of LaserJet printer time and energies.
|
||||||
|
Also, thanks for Dennis L. Mumaugh for the initial shadow password
|
||||||
|
information and to Tony Walton (olapw@olgb1.oliv.co.uk) for the System
|
||||||
|
V Release 4 changes. Effort in porting to SunOS has been contributed
|
||||||
|
by Dr. Michael Newberry (miken@cs.adfa.oz.au) and Micheal J. Miller, Jr.
|
||||||
|
(mke@kaberd.rain.com). Effort in porting to AT&T UNIX System V Release
|
||||||
|
4 has been provided by Andrew Herbert (andrew@werple.pub.uu.oz.au).
|
||||||
|
Special thanks to Marek Michalkiewicz (marekm@i17linuxb.ists.pwr.wroc.pl)
|
||||||
|
for taking over the Linux port of this software.
|
||||||
12
debian/secure-su.postrm
vendored
Normal file
12
debian/secure-su.postrm
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ remove = "$1" ] ; then
|
||||||
|
dpkg-divert --package secure-su --remove --rename \
|
||||||
|
--divert /bin/secure-su/su /bin/su
|
||||||
|
dpkg-divert --package secure-su --remove --rename \
|
||||||
|
--divert /usr/man/man1/gnu-su.1.gz /usr/man/man1/su.1.gz
|
||||||
|
rm /bin/secure-su/README.gz
|
||||||
|
rmdir /bin/secure-su || true
|
||||||
|
fi
|
||||||
14
debian/secure-su.preinst
vendored
Normal file
14
debian/secure-su.preinst
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ install = "$1" ] ; then
|
||||||
|
# dpkg-divert uses rename so can't do cross-device diversions. bleah.
|
||||||
|
[ -d /bin/secure-su ] || mkdir /bin/secure-su
|
||||||
|
chmod 700 /bin/secure-su
|
||||||
|
ln -sf ../../usr/doc/secure-su/README.gz /bin/secure-su/README.gz
|
||||||
|
dpkg-divert --package secure-su --add --rename \
|
||||||
|
--divert /bin/secure-su/su /bin/su
|
||||||
|
dpkg-divert --package secure-su --add --rename \
|
||||||
|
--divert /usr/man/man1/gnu-su.1.gz /usr/man/man1/su.1.gz
|
||||||
|
fi
|
||||||
14
debian/securetty
vendored
Normal file
14
debian/securetty
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# /etc/securetty: list of terminals on which root is allowed to login.
|
||||||
|
# See securetty(5) and login(1).
|
||||||
|
tty1
|
||||||
|
tty2
|
||||||
|
tty3
|
||||||
|
tty4
|
||||||
|
tty5
|
||||||
|
tty6
|
||||||
|
tty7
|
||||||
|
tty8
|
||||||
|
tty9
|
||||||
|
tty10
|
||||||
|
tty11
|
||||||
|
tty12
|
||||||
409
debian/tar.c
vendored
Normal file
409
debian/tar.c
vendored
Normal file
@@ -0,0 +1,409 @@
|
|||||||
|
/*
|
||||||
|
* $Id: tar.c,v 1.2 1999/03/07 19:14:24 marekm Exp $
|
||||||
|
*
|
||||||
|
* This is a wrapper for tar to ensure that all files within the
|
||||||
|
* newly created tar archive have the owner and group set to
|
||||||
|
* root:root. This makes it possible to build Debian packages
|
||||||
|
* without root privileges (normally needed to chown files).
|
||||||
|
*
|
||||||
|
* Assumptions:
|
||||||
|
* - the directory containing this program is listed in $PATH
|
||||||
|
* before the directory containing the real tar program (/bin)
|
||||||
|
* - the options passed to tar cause it to output the archive
|
||||||
|
* (not compressed) on standard output
|
||||||
|
*
|
||||||
|
* Written by Marek Michalkiewicz <marekm@linux.org.pl>,
|
||||||
|
* public domain, no warranty, etc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <fnmatch.h>
|
||||||
|
#include <tar.h>
|
||||||
|
|
||||||
|
#ifndef REAL_TAR
|
||||||
|
#define REAL_TAR "/bin/tar"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define RECORD_SIZE 512
|
||||||
|
|
||||||
|
union record {
|
||||||
|
char data[RECORD_SIZE];
|
||||||
|
struct header {
|
||||||
|
char name[100]; /* NUL-terminated if NUL fits */
|
||||||
|
char mode[8]; /* 0+ spaces, 1-6 octal digits, space, NUL */
|
||||||
|
char uid[8]; /* format same as mode */
|
||||||
|
char gid[8]; /* format same as mode */
|
||||||
|
char size[12]; /* 0+ spaces, 1-11 octal digits, space */
|
||||||
|
/* if '1' <= typeflag <= '6', ignore size */
|
||||||
|
char mtime[12]; /* format same as size */
|
||||||
|
char chksum[8]; /* 0+ spaces, 1-6 octal digits, NUL, space */
|
||||||
|
char typeflag;
|
||||||
|
char linkname[100]; /* NUL-terminated if NUL fits */
|
||||||
|
/* XXX - for GNU tar, magic is "ustar " (no NUL) and version is " \0" */
|
||||||
|
char magic[6]; /* must be TMAGIC (NUL term.) */
|
||||||
|
char version[2]; /* must be TVERSION */
|
||||||
|
char uname[32]; /* NUL-terminated */
|
||||||
|
char gname[32]; /* NUL-terminated */
|
||||||
|
char devmajor[8];
|
||||||
|
char devminor[8];
|
||||||
|
#ifdef GNU_TAR_FORMAT
|
||||||
|
char atime[12];
|
||||||
|
char ctime[12];
|
||||||
|
char offset[12];
|
||||||
|
char longnames[4];
|
||||||
|
char pad;
|
||||||
|
struct sparse {
|
||||||
|
char offset[12];
|
||||||
|
char numbytes[12];
|
||||||
|
} sp[4];
|
||||||
|
char isextended;
|
||||||
|
char realsize[12];
|
||||||
|
#else
|
||||||
|
/* if prefix[0] != NUL then filename = prefix/name else filename = name */
|
||||||
|
char prefix[155]; /* NUL-terminated if NUL fits */
|
||||||
|
#endif
|
||||||
|
} h;
|
||||||
|
#ifdef GNU_TAR_FORMAT
|
||||||
|
struct exthdr {
|
||||||
|
struct sparse sp[21];
|
||||||
|
char isextended;
|
||||||
|
} xh;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static union record tarbuf;
|
||||||
|
static int infd = -1, outfd = -1;
|
||||||
|
|
||||||
|
int main(int, char **);
|
||||||
|
static ssize_t xread(int, char *, size_t);
|
||||||
|
static ssize_t xwrite(int, const char *, size_t);
|
||||||
|
static int block_is_eof(void);
|
||||||
|
static void block_read(void);
|
||||||
|
static void block_write(void);
|
||||||
|
static void verify_magic(void);
|
||||||
|
static void verify_checksum(void);
|
||||||
|
static void update_checksum(void);
|
||||||
|
static void set_owner(const char *);
|
||||||
|
static void set_group(const char *);
|
||||||
|
static void process_archive(void);
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int pipefd[2];
|
||||||
|
pid_t pid;
|
||||||
|
const char *real_tar;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
real_tar = getenv("REAL_TAR");
|
||||||
|
if (!real_tar)
|
||||||
|
real_tar = REAL_TAR;
|
||||||
|
if (pipe(pipefd)) {
|
||||||
|
perror("pipe");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
pid = fork();
|
||||||
|
if (pid == 0) { /* child */
|
||||||
|
/* redirect stdout to the pipe */
|
||||||
|
if (dup2(pipefd[1], STDOUT_FILENO) != 1) {
|
||||||
|
perror("dup2");
|
||||||
|
_exit(126);
|
||||||
|
}
|
||||||
|
close(pipefd[0]);
|
||||||
|
close(pipefd[1]);
|
||||||
|
/* run the real tar program */
|
||||||
|
execv(real_tar, argv);
|
||||||
|
if (errno == ENOENT) {
|
||||||
|
perror("execve");
|
||||||
|
_exit(127);
|
||||||
|
} else {
|
||||||
|
perror("execve");
|
||||||
|
_exit(126);
|
||||||
|
}
|
||||||
|
} else if (pid < 0) { /* error */
|
||||||
|
perror("fork");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* parent */
|
||||||
|
close(pipefd[1]);
|
||||||
|
/* read from pipefd[0], modify tar headers, write to stdout ... */
|
||||||
|
infd = pipefd[0];
|
||||||
|
outfd = STDOUT_FILENO;
|
||||||
|
process_archive();
|
||||||
|
/* wait for the tar subprocess to finish, and return its exit status */
|
||||||
|
status = 1;
|
||||||
|
if (waitpid(pid, &status, 0) == -1) {
|
||||||
|
perror("waitpid");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (WIFSIGNALED(status)) {
|
||||||
|
kill(getpid(), WTERMSIG(status));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
exit(WEXITSTATUS(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EINTR-safe versions of read() and write() - they don't really help much
|
||||||
|
as GNU tar itself (version 1.11.8 at least) is not EINTR-safe, but it
|
||||||
|
doesn't hurt... Also, these functions never return errors - instead,
|
||||||
|
they print an error message to stderr, and exit(1). End of file is
|
||||||
|
indicated by returning the number of bytes actually read. */
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
xread(int fd, char *buf, size_t count)
|
||||||
|
{
|
||||||
|
ssize_t n;
|
||||||
|
size_t left;
|
||||||
|
|
||||||
|
left = count;
|
||||||
|
do {
|
||||||
|
n = read(fd, buf, left);
|
||||||
|
if ((n < 0) && (errno == EINTR))
|
||||||
|
continue;
|
||||||
|
if (n <= 0)
|
||||||
|
break;
|
||||||
|
left -= n;
|
||||||
|
buf += n;
|
||||||
|
} while (left > 0);
|
||||||
|
if (count > left)
|
||||||
|
return count - left;
|
||||||
|
if (n < 0) {
|
||||||
|
perror("read");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
xwrite(int fd, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
ssize_t n;
|
||||||
|
size_t left;
|
||||||
|
|
||||||
|
left = count;
|
||||||
|
do {
|
||||||
|
n = write(fd, buf, left);
|
||||||
|
if (n < 0) {
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
|
/* any other write errors are fatal */
|
||||||
|
perror("write");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
left -= n;
|
||||||
|
buf += n;
|
||||||
|
} while (left > 0);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
block_is_eof(void)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(tarbuf.data); i++) {
|
||||||
|
if (tarbuf.data[i])
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
block_read(void)
|
||||||
|
{
|
||||||
|
ssize_t nread;
|
||||||
|
|
||||||
|
nread = xread(infd, tarbuf.data, RECORD_SIZE);
|
||||||
|
if (nread != RECORD_SIZE) {
|
||||||
|
fprintf(stderr, "unexpected end of file\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
block_write(void)
|
||||||
|
{
|
||||||
|
xwrite(outfd, tarbuf.data, RECORD_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
verify_magic(void)
|
||||||
|
{
|
||||||
|
/* only check that magic starts with "ustar" - works for
|
||||||
|
standard UNIX tar as well as GNU tar formats. */
|
||||||
|
if (strncmp(tarbuf.h.magic, "ustar", 5) != 0) {
|
||||||
|
fprintf(stderr, "bad tar header magic\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
verify_checksum(void)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
int csum;
|
||||||
|
|
||||||
|
if (sscanf(tarbuf.h.chksum, "%o", &csum) != 1) {
|
||||||
|
fprintf(stderr, "bad tar checksum format\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
memset(tarbuf.h.chksum, ' ', sizeof(tarbuf.h.chksum));
|
||||||
|
for (i = 0; i < sizeof(tarbuf.data); i++)
|
||||||
|
csum -= (unsigned char) tarbuf.data[i];
|
||||||
|
if (csum) {
|
||||||
|
fprintf(stderr, "bad tar checksum value\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_checksum(void)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
int csum;
|
||||||
|
|
||||||
|
memset(tarbuf.h.chksum, ' ', sizeof(tarbuf.h.chksum));
|
||||||
|
csum = 0;
|
||||||
|
for (i = 0; i < sizeof(tarbuf.data); i++)
|
||||||
|
csum += (unsigned char) tarbuf.data[i];
|
||||||
|
snprintf(tarbuf.h.chksum, sizeof(tarbuf.h.chksum), "%6o", csum);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_owner(const char *username)
|
||||||
|
{
|
||||||
|
const struct passwd *pw;
|
||||||
|
|
||||||
|
pw = getpwnam(username);
|
||||||
|
memset(tarbuf.h.uname, 0, sizeof(tarbuf.h.uname));
|
||||||
|
snprintf(tarbuf.h.uname, sizeof(tarbuf.h.uname), "%s", username);
|
||||||
|
snprintf(tarbuf.h.uid, sizeof(tarbuf.h.uid), "%6o ", (int) (pw ? pw->pw_uid : 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_group(const char *groupname)
|
||||||
|
{
|
||||||
|
const struct group *gr;
|
||||||
|
|
||||||
|
gr = getgrnam(groupname);
|
||||||
|
memset(tarbuf.h.gname, 0, sizeof(tarbuf.h.gname));
|
||||||
|
snprintf(tarbuf.h.gname, sizeof(tarbuf.h.gname), "%s", groupname);
|
||||||
|
snprintf(tarbuf.h.gid, sizeof(tarbuf.h.gid), "%6o ", (int) (gr ? gr->gr_gid : 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_archive(void)
|
||||||
|
{
|
||||||
|
ssize_t nread;
|
||||||
|
long size;
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
for (;;) {
|
||||||
|
/* read the header or data block */
|
||||||
|
block_read();
|
||||||
|
/* copy data blocks, if any */
|
||||||
|
if (size > 0) {
|
||||||
|
block_write();
|
||||||
|
size -= RECORD_SIZE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (block_is_eof()) {
|
||||||
|
/* eof marker */
|
||||||
|
block_write();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
verify_magic();
|
||||||
|
verify_checksum();
|
||||||
|
|
||||||
|
/* process the header */
|
||||||
|
switch (tarbuf.h.typeflag) {
|
||||||
|
case LNKTYPE:
|
||||||
|
case SYMTYPE:
|
||||||
|
case CHRTYPE:
|
||||||
|
case BLKTYPE:
|
||||||
|
case DIRTYPE:
|
||||||
|
case FIFOTYPE:
|
||||||
|
/* no data blocks - ignore size */
|
||||||
|
break;
|
||||||
|
case REGTYPE:
|
||||||
|
case AREGTYPE:
|
||||||
|
case CONTTYPE:
|
||||||
|
default:
|
||||||
|
if (sscanf(tarbuf.h.size, "%lo", &size) != 1) {
|
||||||
|
fprintf(stderr, "bad size format\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX - for now, just chown all files to root:root. */
|
||||||
|
set_owner("root");
|
||||||
|
set_group("root");
|
||||||
|
|
||||||
|
update_checksum();
|
||||||
|
/* write the modified header */
|
||||||
|
block_write();
|
||||||
|
}
|
||||||
|
/* eof marker detected, copy anything beyond it */
|
||||||
|
for (;;) {
|
||||||
|
nread = xread(infd, tarbuf.data, RECORD_SIZE);
|
||||||
|
if (nread == 0)
|
||||||
|
break; /* end of file */
|
||||||
|
xwrite(outfd, tarbuf.data, (size_t) nread);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* permission specification file format, fixperms-1.00 compatible:
|
||||||
|
type filename owner group mode [linkname | major minor] [# comment]
|
||||||
|
|
||||||
|
type:
|
||||||
|
- = regular file
|
||||||
|
l = link
|
||||||
|
d = directory
|
||||||
|
c = char dev
|
||||||
|
b = block dev
|
||||||
|
p = fifo
|
||||||
|
s = socket
|
||||||
|
|
||||||
|
filename - absolute pathname, wildcards ok [not for fixperms]
|
||||||
|
linkname - only for type l
|
||||||
|
major, minor - only for type c or b
|
||||||
|
owner group - numeric, or names [not for fixperms]
|
||||||
|
|
||||||
|
XXX not yet implemented
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct permspec {
|
||||||
|
char *name;
|
||||||
|
uid_t uid;
|
||||||
|
gid_t gid;
|
||||||
|
mode_t mode;
|
||||||
|
char *uname;
|
||||||
|
char *gname;
|
||||||
|
char *linkname;
|
||||||
|
dev_t dev;
|
||||||
|
struct permspec *next;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
48
doc/ANNOUNCE
Normal file
48
doc/ANNOUNCE
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
$Id: ANNOUNCE,v 1.3 1998/01/29 23:22:25 marekm Exp $
|
||||||
|
|
||||||
|
[ This is the original comp.os.linux.announce posting (only the
|
||||||
|
author's name and e-mail address has been updated), kept here
|
||||||
|
for historical reasons. Many things have changed since then.
|
||||||
|
Linux distributions are using it, and the mailing list address
|
||||||
|
has been changed. See README.linux (in the same directory)
|
||||||
|
for more up to date information. --marekm ]
|
||||||
|
|
||||||
|
This is a new beta release of the Shadow Password Suite for Linux.
|
||||||
|
Many bugs have been reported (and fixed!), and the package is now
|
||||||
|
under a BSD-style copyright. It was written by Julianne F. Haugh
|
||||||
|
<jfh@tab.com>, and the Linux port is now maintained by me.
|
||||||
|
|
||||||
|
Again, this is beta software which may still have some bugs, please
|
||||||
|
treat it as such. Please don't install it if you don't know what
|
||||||
|
you're doing. Please test it as much as you can, and report any
|
||||||
|
bugs - if you report them, they will be fixed! If all goes well,
|
||||||
|
Shadow should be stable enough for general use within a few months.
|
||||||
|
Once it is stable, Linux distributions can start using it - there
|
||||||
|
are no copyright problems anymore.
|
||||||
|
|
||||||
|
Thanks to Greg Gallagher <ggallag@orion.it.luc.edu> there is now
|
||||||
|
a developers mailing list, shadow-list@neptune.cin.net. Send the
|
||||||
|
command "subscribe" to shadow-list-request@neptune.cin.net (NOT to
|
||||||
|
the mailing list itself!) to subscribe if you are interested.
|
||||||
|
|
||||||
|
|
||||||
|
LSM entry follows:
|
||||||
|
|
||||||
|
Begin3
|
||||||
|
Title: Shadow Password Suite
|
||||||
|
Version: 3.3.3-951218
|
||||||
|
Entered-date: 18DEC95
|
||||||
|
Description:
|
||||||
|
Keywords: login passwd security shadow
|
||||||
|
Author: jfh@tab.com (Julie Haugh)
|
||||||
|
Maintained-by: marekm@i17linuxb.ists.pwr.wroc.pl (Marek Michalkiewicz)
|
||||||
|
Primary-site: sunsite.unc.edu /pub/Linux/system/Admin
|
||||||
|
220K shadow-951218.tar.gz
|
||||||
|
Alternate-site: ftp.ists.pwr.wroc.pl /pub/linux/shadow
|
||||||
|
Original-site: ftp.uu.net ?
|
||||||
|
Platforms:
|
||||||
|
Copying-policy: BSD-like
|
||||||
|
End
|
||||||
|
|
||||||
|
Marek Michalkiewicz
|
||||||
|
marekm@i17linuxb.ists.pwr.wroc.pl
|
||||||
625
doc/CHANGES
Normal file
625
doc/CHANGES
Normal file
@@ -0,0 +1,625 @@
|
|||||||
|
$Id: CHANGES,v 1.27 1999/07/09 18:02:43 marekm Exp $
|
||||||
|
|
||||||
|
shadow-19990607 => shadow-19990709
|
||||||
|
|
||||||
|
- added PAM support to chfn and chsh (thanks to Thorsten Kukuk)
|
||||||
|
- fixed a bug in newgrp if the user is in >= 17 groups
|
||||||
|
- added @LIBSKEY@ to LDADD for all programs (for some reason,
|
||||||
|
almost all programs need it if skey/opie support is enabled)
|
||||||
|
- changed grpconv/grpunconv to compile with --disable-shadowgrp
|
||||||
|
- changed faillog to do something (assume -p) with no options specified
|
||||||
|
- updated version of the udbachk passwd/shadow/group file integrity
|
||||||
|
checker (contrib/udbachk.v012.tgz)
|
||||||
|
|
||||||
|
shadow-19990307 => shadow-19990607
|
||||||
|
|
||||||
|
- upgraded to libtool-1.2, latest config.{guess,sub}
|
||||||
|
- added missing #include "defines.h" in libmisc/login_desrpc.c - thanks
|
||||||
|
to almost everyone for reporting it :-)
|
||||||
|
- moved PAM-related defines to pam_defs.h
|
||||||
|
- added some braces to if/else to avoid egcs warnings
|
||||||
|
- started adding PAM support to login (based on util-linux, not finished yet)
|
||||||
|
- changed "!" to "x" for pw_passwd in src/newusers.c
|
||||||
|
- a few more Y2K fixes
|
||||||
|
- added contrib/udbachk.tgz (passwd/shadow/group file integrity checker),
|
||||||
|
thanks to Sami Kerola
|
||||||
|
- Debian: made /etc/{limits,login.access,login.defs,porttime,securetty}
|
||||||
|
files all mode 0600 (Bug#38729 - login: /etc/limits is world readable)
|
||||||
|
- updated mailing list information (moved again, now hosted by SuSE),
|
||||||
|
updated README.mirrors, other minor documentation updates
|
||||||
|
- made getpass work with redirected stdin
|
||||||
|
- new readpass echoing asterisks disabled by default by popular demand
|
||||||
|
(can be enabled at compile time: ./configure --enable-readpass)
|
||||||
|
- the random number of asterisks in readpass is now more random
|
||||||
|
(random number generator initialization was missing)
|
||||||
|
- commented out --enable-md5crypt (obsolete) in configure.in
|
||||||
|
- when checking for libskey, link with -lcrypt if libcrypt is available
|
||||||
|
(otherwise the configure test for libskey fails - libskey needs libcrypt)
|
||||||
|
- added Package/Version ident strings (so you can use the RCS "ident"
|
||||||
|
command to check any binary, which version of shadow it comes from)
|
||||||
|
|
||||||
|
shadow-981228 => shadow-19990307
|
||||||
|
|
||||||
|
- added support for setting process priority in /etc/limits
|
||||||
|
- i18n: updated Greek translation
|
||||||
|
- i18n: added Polish translation by Arkadiusz Miskiewicz
|
||||||
|
- documented the -p option in useradd.8 and usermod.8 man pages
|
||||||
|
- some "const" gcc warning fixes
|
||||||
|
- attempt to fix lib/snprintf.c compilation problems
|
||||||
|
- added restart/reload/force-reload to /etc/init.d/logoutd (found by lintian)
|
||||||
|
- always require password for root logins (even with NO_PASSWORD_CONSOLE)
|
||||||
|
- workaround for RedHat's CREATE_HOME feature in /etc/login.defs
|
||||||
|
- changed to Y2K compatible version numbering
|
||||||
|
- more Y2K fixes, use the ISO 8601 date format (yyyy-mm-dd) for default
|
||||||
|
values of user-entered dates (you can still enter dates in any format
|
||||||
|
supported by GNU date)
|
||||||
|
- oops, added doc/README.nls to list of files to distribute
|
||||||
|
- added missing sanitize_env() call to src/login.c
|
||||||
|
- debian/rules installs /bin/login non-setuid by default, just in case...
|
||||||
|
- build Debian packages with cracklib support (depends on cracklib-runtime)
|
||||||
|
|
||||||
|
shadow-980724 => shadow-981228
|
||||||
|
|
||||||
|
- login now clears the username in argv[] (in case someone types the
|
||||||
|
password instead of username, by mistake)
|
||||||
|
- i18n support, Greek translation (Nikos Mavroyanopoulos), see README.nls
|
||||||
|
- updated author's e-mail address (jfh@tab.com -> jfh@bga.com)
|
||||||
|
- new getpass() replacement that displays *'s (Pavel Machek)
|
||||||
|
- no password required when logging in from ttys listed under
|
||||||
|
NO_PASSWORD_CONSOLE in login.defs (Pavel Machek)
|
||||||
|
- fixed limits code so RLIMIT_AS should work
|
||||||
|
- upgraded to Debian 2.0
|
||||||
|
- built a new machine (P2 350MHz, 64MB RAM) so the thing can be compiled
|
||||||
|
in reasonable time again
|
||||||
|
- upgraded to automake-1.3, libtool-1.0h (also new config.guess and
|
||||||
|
config.sub that work on i686)
|
||||||
|
- usermod fixed to handle group names starting with digits (not recommended)
|
||||||
|
|
||||||
|
shadow-980626 => shadow-980724
|
||||||
|
|
||||||
|
- security: login no longer gives you a root shell if setgid()
|
||||||
|
or initgroups() or setuid() fails for any reason, discovered
|
||||||
|
by Ted Hickman <thickman@sy.net>
|
||||||
|
- remove libshadow.so -> libshadow.so.x.x symlink after install
|
||||||
|
- a few int -> uid_t type cleanups
|
||||||
|
- fail immediately (don't retry) in *_lock() if euid != 0
|
||||||
|
- added sample PAM config files etc/pam.d/{passwd,su}
|
||||||
|
- preliminary PAM support in su (untested - use at your own risk,
|
||||||
|
comments and patches welcome!)
|
||||||
|
- cleanup and more comments in OPIE code (Algis Rudys)
|
||||||
|
- added support for TCFS (Transparent Cryptographic File System)
|
||||||
|
(use ./configure --with-libtcfs, see http://tcfs.dia.unisa.it/
|
||||||
|
for more info), thanks to Aniello Del Sorbo
|
||||||
|
|
||||||
|
shadow-980529 => shadow-980626
|
||||||
|
|
||||||
|
- fixed bug in commonio_lock() (infinite recursion if lckpwdf() not
|
||||||
|
used and database cannot be locked), thanks to Jonathan Hankins
|
||||||
|
- fixed bug in copy_tree() (NUL-terminate readlink() results),
|
||||||
|
thanks to Lutz Schwalowsky
|
||||||
|
- no need to press Enter after Ctrl-C to interrupt password prompt
|
||||||
|
- removed a few harmless gcc warnings
|
||||||
|
- secure RPC login disabled if <rpc/key_prot.h> not found (glibc 2.0)
|
||||||
|
- faillog.8: changed /usr/adm -> /var/log
|
||||||
|
- pwconv.8: documented that it may fail on invalid password files
|
||||||
|
|
||||||
|
shadow-980417 => shadow-980529
|
||||||
|
|
||||||
|
- fixed "interesting" strzero() bug introduced by me in 980417:
|
||||||
|
strzero(cp) didn't work as intended (the macro used a local
|
||||||
|
variable called "cp" - oops...); Leonard N. Zubkoff was the
|
||||||
|
first person to report it - thanks!
|
||||||
|
- fixed usermod -e to accept empty argument (like useradd),
|
||||||
|
thanks to Martin Bene
|
||||||
|
- several changes from Debian 980403-0.2, see debian/changelog
|
||||||
|
- added contrib/shadow-anonftp.patch (not yet merged, sorry...)
|
||||||
|
thanks to Calle Karlsson
|
||||||
|
|
||||||
|
shadow-980403 => shadow-980417
|
||||||
|
|
||||||
|
- fixed login session limits (again - broken since 980130)
|
||||||
|
- more symbolic constants for exit status values
|
||||||
|
- fixed logoutd to work with 8-character usernames in utmp
|
||||||
|
(no room for terminating NUL!)
|
||||||
|
- various fixes to make the code more glibc2-friendly
|
||||||
|
- updated doc/cracklib26.diff (fix for empty gecos, etc.)
|
||||||
|
- updated the files in redhat/ from shadow-utils-970616-11.src.rpm
|
||||||
|
(RH 5.0 updates)
|
||||||
|
|
||||||
|
shadow-980130 => shadow-980403
|
||||||
|
|
||||||
|
- security: su now creates the sulog file (if enabled and doesn't
|
||||||
|
already exist) with umask 077
|
||||||
|
- hopefully removed arbitrary group size limits (not yet for
|
||||||
|
shadow groups though - sgetsgent() still needs a rewrite,
|
||||||
|
but I don't want to delay this release any longer...)
|
||||||
|
- fixed NULL dereference in groupmod -n
|
||||||
|
|
||||||
|
shadow-971215 => shadow-980130
|
||||||
|
|
||||||
|
- Debian binary packages can be built without root privileges
|
||||||
|
(tar wrapper - debian/tar.c)
|
||||||
|
- new subdir "redhat" (needs more work, see redhat/README)
|
||||||
|
- in several places, exit(127) if exec fails with ENOENT, and
|
||||||
|
exit(126) on other errors (as in ksh and bash)
|
||||||
|
- renamed getpass() and md5_crypt() to libshadow_* to avoid name
|
||||||
|
conflicts with libc functions - md5_crypt() is also in libcrypt.a
|
||||||
|
on Linux/PPC, thanks to Anton Gluck <gluc@midway.uchicago.edu>
|
||||||
|
- handle crypt() returning NULL (possible according to Single Unix
|
||||||
|
Spec) more gracefully (exit instead of SIGSEGV)
|
||||||
|
- fixed bug in putgrent() that showed up when realloc() moved the
|
||||||
|
buffer while expanding it, thanks to Floody <flood@evcom.net>
|
||||||
|
- fixed bug in login session limits (with a limit set to N logins,
|
||||||
|
only N-1 logins were allowed), thanks to Floody <flood@evcom.net>
|
||||||
|
- upgraded to libtool-1.0h (now recognizes GNU ld on Debian 1.3.1)
|
||||||
|
- newer config.guess and config.sub (should work on x86 for x > 5)
|
||||||
|
- removed doc/automake-1.0.diff (obsoleted by automake-1.2)
|
||||||
|
- added doc/cracklib26.diff (some patches for cracklib-2.6)
|
||||||
|
- documented more (not all yet) login.defs(5) settings
|
||||||
|
- replaced more exit status numeric values with #defines
|
||||||
|
- shadow-utils.spec now generated from shadow-utils.spec.in
|
||||||
|
(so I don't have to edit version numbers for every new release)
|
||||||
|
- groupadd -f option, based on RedHat's shadow-utils-970616-9 patch
|
||||||
|
("force" - exit(0) if the group already exists); other RedHat-
|
||||||
|
specific options not added yet (best done in a perl script that
|
||||||
|
runs useradd/usermod/groupadd - see Debian's adduser-3.x)
|
||||||
|
- added -O option (override login.defs values) to useradd and groupadd
|
||||||
|
- if usermod can't update the group file(s), exit(10) but update the
|
||||||
|
password file(s) anyway (as documented by Solaris man page)
|
||||||
|
- useradd should no longer set sp_expire to the current date (oops)
|
||||||
|
- configure.in: added --enable-desrpc, check for gethostbyname in libc
|
||||||
|
before trying libnsl (necessary for Solaris; not for Linux or Irix,
|
||||||
|
even though libnsl may be present), fixed pw_age/pw_comment/pw_quota
|
||||||
|
detection, setpgrp vs. setpgid, other minor tweaks
|
||||||
|
- various */Makefile.am tweaks
|
||||||
|
- login.defs: added FAKE_SHELL - program to run instead of the login
|
||||||
|
shell, with the real shell in argv[0] (Frank Denis)
|
||||||
|
- login.defs: ignore case in yes/no settings
|
||||||
|
- more E_* defines instead of hardcoded numbers for exit()
|
||||||
|
- added sanitize_env() for setuid programs
|
||||||
|
- login_desrpc() checks for getnetname() errors
|
||||||
|
- new password is not "too similar" if it is long enough
|
||||||
|
- replacement strstr() was static, no one noticed :-)
|
||||||
|
- {pw,spw}_lock() and {pw,spw}_unlock() track the lock count and call
|
||||||
|
lckpwdf() and ulckpwdf() as needed, *_lock_first() hack removed
|
||||||
|
- login sets $REMOTEHOST for remote logins
|
||||||
|
- added newgrp -l option (Single Unix Spec, same as "-")
|
||||||
|
- EXPERIMENTAL shared lib support using libtool (libshadow.so saves about
|
||||||
|
200K of disk space on Linux/x86), enabled by default if supported by
|
||||||
|
the system, use ./configure --disable-shared if it causes any problems.
|
||||||
|
Warning: libshadow.so is intended for internal use by this package
|
||||||
|
only - binary compatibility with future releases is not guaranteed.
|
||||||
|
There should be no need to link any other programs with libshadow.so -
|
||||||
|
the libshadow.so -> libshadow.so.x.x symlink is unnecessary.
|
||||||
|
- pam_strerror() takes one or two arguments, depending on the Linux-PAM
|
||||||
|
version (!) - added check to configure; fixed do_pam_passwd prototype
|
||||||
|
- libmisc/login_access.c should compile on Linux/PPC and Solaris
|
||||||
|
- added information about the new ftp site to doc/README.mirrors
|
||||||
|
|
||||||
|
shadow-971001 => shadow-971215
|
||||||
|
|
||||||
|
- added workaround for NYS libc 5.3.12 (RedHat 4.2) bug to grpck
|
||||||
|
- updated the RPM .spec file
|
||||||
|
- renamed rlogin() to do_rlogin() to avoid Linux/PPC build problem
|
||||||
|
(glibc defines something else named "rlogin" in utmpbits.h ?)
|
||||||
|
- added MD5 checksums in Debian packages
|
||||||
|
- added -p and -g options to vipw (edit the password or group file
|
||||||
|
respectively, regardless of the command name in argv[0])
|
||||||
|
- removed old DBM support (NDBM code is still there)
|
||||||
|
- fixed a bug in gpasswd: current username was incorrectly identified as
|
||||||
|
"root" because of setuid(0) done too early. It may be a security hole
|
||||||
|
when using shadow groups - if "root" is listed as a group administrator,
|
||||||
|
any user can add/remove members in that group. Thanks to Jesse Thilo.
|
||||||
|
- gpasswd now logs which user (root or group admin) made the changes
|
||||||
|
- passwd now uses $PATH to search for the chfn, chsh, gpasswd commands
|
||||||
|
- newgrp and add_groups() allocate supplementary group lists dynamically
|
||||||
|
- moved check_shell() from src/chsh.c to libmisc/chkshell.c
|
||||||
|
- CHFN_RESTRICT in login.defs can now specify exactly which fields may be
|
||||||
|
changed by regular users (any combination of letters "frwh")
|
||||||
|
- fixed contrib/pwdauth.c segfault with non-existent usernames
|
||||||
|
- minor change in lib/getdef.c to handle quotes better (Juergen Heinzl)
|
||||||
|
- new date parsing code (from GNU date) used by useradd, usermod, chage
|
||||||
|
- upgraded to automake-1.2, added libtool-0.7 (no libshadow.so yet)
|
||||||
|
- converted code to ANSI C, added ansi2knr (untested - use gcc!)
|
||||||
|
- fixed useradd -G segfault (one '*' that shouldn't be there)
|
||||||
|
- allow 8-bit characters in chfn
|
||||||
|
- added support for RLIMIT_AS (max address space) in libmisc/limits.c
|
||||||
|
- changed the handling of NIS plus entries in password files
|
||||||
|
- some more tweaking in various debian/* files
|
||||||
|
- logoutd uses getutent() instead of reading utmp file directly
|
||||||
|
- fixed lckpwdf() called twice (and failing) when changing password
|
||||||
|
if the user is not listed in /etc/shadow (Mike Pakovic)
|
||||||
|
- erase and kill characters left unchanged if not defined in login.defs
|
||||||
|
|
||||||
|
shadow-970616 => shadow-971001
|
||||||
|
|
||||||
|
- Debian: mkpasswd no longer installed (dbm files not supported)
|
||||||
|
- chpasswd checks for shadow/non-shadow at run time, too
|
||||||
|
- added chpasswd -e (input file with encrypted passwords) - Jay Soffian
|
||||||
|
- changed libmisc/login_access.c as suggested by Dave Hagewood
|
||||||
|
- replaced sprintf() with snprintf() in several places
|
||||||
|
- added lib/snprintf.[ch] (from XFree86) for systems without snprintf()
|
||||||
|
- minor tweaks in contrib/adduser.c (/usr/local -> /usr)
|
||||||
|
- non-root users can only run su with a terminal on stdin
|
||||||
|
- temporarily disabled DES_RPC because getsecretkey() causes login to hang
|
||||||
|
for 5 minutes on at least one RH 4.0 system. Not sure if this is a bug
|
||||||
|
in libc, or system misconfiguration. Needs further investigation.
|
||||||
|
- check for strerror() and -lrpcsvc (should compile on SunOS again)
|
||||||
|
- fixed free() called twice in libmisc/mail.c
|
||||||
|
- added information about mirror sites (doc/README.mirrors)
|
||||||
|
- updated pwconv.8 and pwunconv.8 man pages
|
||||||
|
- "make install" now installs pwconv, pwunconv, grpconv, grpunconv
|
||||||
|
- pwauth.8 no longer installed (AUTH_METHODS not supported by default)
|
||||||
|
- corrected su.1 man page ($SHELL not used)
|
||||||
|
- no need for --with-md5crypt if the MD5-based crypt() is already in libc
|
||||||
|
(or another library specified in /etc/ld.so.preload - Linux ld.so 1.8.0+)
|
||||||
|
- cleaned up PASS_MAX in getpass() (127 always assumed)
|
||||||
|
- default editor for vipw changed from /bin/ae to a real editor :)
|
||||||
|
|
||||||
|
shadow-970601 => shadow-970616
|
||||||
|
|
||||||
|
- fixed execlp call (missing NULL) in src/vipw.c
|
||||||
|
- vipw now preserves permissions on edited files
|
||||||
|
- commented out the xdm-shadow hack in shadowconfig
|
||||||
|
- improved RedHat spec file (Timo Karjalainen)
|
||||||
|
- updated mailing list information
|
||||||
|
- added information about the shadow paper (doc/README.shadow-paper)
|
||||||
|
- renamed doc/console.c.spec (confused RPM)
|
||||||
|
|
||||||
|
shadow-970502-2 => shadow-970601
|
||||||
|
|
||||||
|
- fixed a typo in libmisc/mail.c causing login to segfault
|
||||||
|
if MAIL_CHECK_ENAB=yes (sorry!)
|
||||||
|
- patches for OPIE support (Algis Rudys) (untested)
|
||||||
|
- programs that modify /etc/passwd or /etc/shadow will use
|
||||||
|
lckpwdf() if available
|
||||||
|
- now compiles with PAM support! (still untested)
|
||||||
|
- cosmetic error message changes (prefixed by argv[0]:)
|
||||||
|
|
||||||
|
shadow-970216 => shadow-970502-2
|
||||||
|
|
||||||
|
- shadow group support fixes (grpconv didn't work - for some
|
||||||
|
reason, putsgent() returns 1 instead of 0 on success;
|
||||||
|
now -1 = failure, anything else = success)
|
||||||
|
- upgraded to autoconf-2.12
|
||||||
|
- pwconv and pwunconv now follow other UN*X systems and SVID3
|
||||||
|
(modify files in place), original versions moved to "old"
|
||||||
|
- scologin.c moved to "old" (it was only for SCO Xenix) so
|
||||||
|
people stop sending patches for scologin.c gcc warnings :)
|
||||||
|
- don't use the MD5* functions in libmisc/salt.c (glibc has
|
||||||
|
the new md5 crypt(), but no <md5.h> and MD5* functions!)
|
||||||
|
- support for MkLinux, Solaris, JIS, Qmail (Frank Denis)
|
||||||
|
- "passwd -S -a" now really works
|
||||||
|
- support for Debian, vipw, a few fixes (Guy Maor)
|
||||||
|
- src/login.c radius bug fix (Rafal Maszkowski)
|
||||||
|
- ISSUE_FILE_ENAB -> ISSUE_FILE in the sample /etc/login.defs
|
||||||
|
- fixes for glibc and DES_RPC (Thorsten Kukuk)
|
||||||
|
- limits.5 man page (Luca Berra)
|
||||||
|
- expiry will work setgid shadow too, removed euid 0 check
|
||||||
|
- added check for a64l() to configure (glibc)
|
||||||
|
|
||||||
|
shadow-961025 => shadow-970216
|
||||||
|
|
||||||
|
- major rewrite of *io.c (no more 4 copies of almost identical code)
|
||||||
|
- use fsync() (if available) instead of sync() when updating password files
|
||||||
|
- use fchmod() and fchown() if available
|
||||||
|
- keep the NIS "plus on a line by itself" entries at end of passwd/group
|
||||||
|
- configure checks location of passwd/chfn/chsh programs (/usr/bin or /bin)
|
||||||
|
- passwd -S -a: list information about all users (root only)
|
||||||
|
- passwd -k: change only expired passwords
|
||||||
|
- passwd -q: quiet mode
|
||||||
|
- first attempt at PAM support in passwd
|
||||||
|
- passwd updates the non-shadow password if /etc/shadow exists but the
|
||||||
|
user has no shadow password
|
||||||
|
- passwd logs who changed the password, added hook to allow non-root
|
||||||
|
administrators who can change passwords (not implemented yet)
|
||||||
|
- su sets $HOME even without the "-" option (suggested by Joey Hess)
|
||||||
|
- added -p (set encrypted password) option to useradd and usermod
|
||||||
|
(idea from hpux10 - undocumented option used internally by SAM)
|
||||||
|
- useradd -D -e does the right thing (set default expiration date)
|
||||||
|
- USERDEL_CMD in login.defs instead of hardcoded {ATRM,CRONTAB}_COMMAND
|
||||||
|
because there are just too many systems that need different commands
|
||||||
|
- removed #ifdef FAILLOG_LOCKTIME (now always enabled), warning: the
|
||||||
|
faillog file format has been changed (somewhere between 960129 and
|
||||||
|
960810), please truncate the old file (if any) to zero length
|
||||||
|
- ISSUE_FILE (may be different from /etc/issue) instead of ISSUE_FILE_ENAB
|
||||||
|
- wtmp, lastlog, faillog file location guessed by configure
|
||||||
|
- separate checks for invalid user and group names, max username length
|
||||||
|
based on struct utmp (it's not always 8 characters)
|
||||||
|
- pwck and grpck now check for invalid user/group names
|
||||||
|
- pwck -q (quiet, report only serious problems) option added
|
||||||
|
- separate cleaner sgetpwent() without the NIS magic
|
||||||
|
- NIS entries ignored (never changed) by *io.c, pwck, grpck
|
||||||
|
- various code cleanups
|
||||||
|
- new get_my_pwent() function for getting my own username, uid etc.
|
||||||
|
- faillog opens the file read-write if possible (even if not root)
|
||||||
|
- passwd -S allowed for normal users (for their own uid only)
|
||||||
|
- handle the case of login denied to passwordless accounts better
|
||||||
|
("Login incorrect" without "Password:" prompt looks strange)
|
||||||
|
- corrected author information and removed a copyright restriction
|
||||||
|
|
||||||
|
shadow-960925 => shadow-961025
|
||||||
|
|
||||||
|
- fixed a few typos in shadow group code
|
||||||
|
- don't check for names starting with 'r' to determine if the shell
|
||||||
|
is restricted, use /etc/shells instead (for the "rc" shell)
|
||||||
|
- removed extra definition of LASTLOG_FILE in configure.in
|
||||||
|
- expiry no longer segfaults if no /etc/shadow
|
||||||
|
- userdel -r "can't remove mailbox" warning no longer printed on success
|
||||||
|
- useradd exit codes changed to match hpux10 man page
|
||||||
|
- fixed possible fd leak etc. in file locking code (lib/commonio.c)
|
||||||
|
|
||||||
|
shadow-960920 => shadow-960925
|
||||||
|
|
||||||
|
- bug fixes to the new environment code using malloc
|
||||||
|
- use hardcoded names instead of basename(argv[0]) for openlog() in programs
|
||||||
|
that users can run (chage, chfn, chsh, gpasswd, login, newgrp, passwd, su)
|
||||||
|
- small fix to isexpired(), and use it in passwd as well
|
||||||
|
- use strftime() and strptime() if available
|
||||||
|
- added chmod 600 /etc/passwd- at the end of pwconv5 (backup file may
|
||||||
|
contain encrypted passwords!)
|
||||||
|
- pass size to change_field (chage, chfn, chsh) instead of assuming BUFSIZ
|
||||||
|
(nothing bad happened yet, just a cleanup)
|
||||||
|
- gpasswd should work with both shadow and non-shadow group passwords
|
||||||
|
- detect unsupported options if no shadow (gpasswd, useradd, usermod)
|
||||||
|
- passwd -e for sunos4 (ATT_AGE), untested
|
||||||
|
- read environment from file (ENVIRON_FILE in login.defs), idea from ssh
|
||||||
|
- small fix to l64a()
|
||||||
|
- passwd prints a message after password successfully changed (for things
|
||||||
|
like poppassd which run passwd and expect some output)
|
||||||
|
- passwd logs if password was changed by root (as opposed to a luser)
|
||||||
|
- passwd uses current uid if no username argument and getlogin() fails
|
||||||
|
|
||||||
|
shadow-960910 => shadow-960920
|
||||||
|
|
||||||
|
- use malloc for environment variables, no more MAXENV (Juergen Heinzl)
|
||||||
|
- newusers should work with both shadow and non-shadow passwords
|
||||||
|
(still left to do: chpasswd, gpasswd)
|
||||||
|
- login-static no longer compiled by default
|
||||||
|
- more SYSLOG() macros
|
||||||
|
|
||||||
|
shadow-960810 => shadow-960910
|
||||||
|
|
||||||
|
- updated README.linux to point to the new ftp site
|
||||||
|
- chfn and chsh optionally (CHFN_AUTH) prompt for password like util-linux
|
||||||
|
- man pages now closer to LDP standards (Ivan Nejgebauer)
|
||||||
|
- newgrp uses SYSLOG_SG_ENAB (not SU) as in the /etc/login.defs comments
|
||||||
|
- obscure.c fixed to compile with HAVE_LIBCRACK
|
||||||
|
- cosmetic message changes in age.c
|
||||||
|
- utmp open error check fixed in utmp.c
|
||||||
|
- grpunconv added (Michael Meskes)
|
||||||
|
- login reports invalid login time, not "Login incorrect" (Ivan Nejgebauer)
|
||||||
|
- logoutd sets OPOST before writing to the tty (Ivan Nejgebauer)
|
||||||
|
- sulogin: don't use syslog(), other minor changes (Ivan Nejgebauer)
|
||||||
|
- passwords can be changed if sp_max == -1 (now considered infinity)
|
||||||
|
- usermod: don't use sizeof(struct lastlog) when writing to faillog (ugh)
|
||||||
|
- started replacing lots of #ifdef USE_SYSLOG with cleaner macros
|
||||||
|
- contrib/rpasswd.c added (Joshua Cowan)
|
||||||
|
- PASS_MAX is 127 with MD5_CRYPT (not just for Linux - sunos4 too...)
|
||||||
|
- workarounds for a RedHat NYS libc getspnam() bug (if /etc/shadow
|
||||||
|
doesn't exist, it succeeds and returns sp_lstchg==0 instead of -1).
|
||||||
|
|
||||||
|
shadow-960129 => shadow-960810
|
||||||
|
|
||||||
|
- automake, configure checks for libcrypt and libcrack (Janos Farkas)
|
||||||
|
- added --enable-shadowgrp to configure (shadow groups disabled by default)
|
||||||
|
- should compile on SunOS 4.1.x - but it does NOT mean that it works :-)
|
||||||
|
- login sets HUSHLOGIN=TRUE or FALSE (for shell startup scripts etc.)
|
||||||
|
- hopefully removed all the rcsid warnings
|
||||||
|
- contrib/atudel perl script to remove at jobs (thanks to Brian Gaeke)
|
||||||
|
- resource limits (Cristian Gafton)
|
||||||
|
- workaround for buggy init/getty(?) leaving junk in ut_host on RedHat
|
||||||
|
- more fixes in man pages
|
||||||
|
- pwck and grpck no longer suggest to run mkpasswd if *DBM not compiled in
|
||||||
|
- most programs (groupadd, groupdel, groupmod, grpck, login, passwd, pwck,
|
||||||
|
su, useradd, userdel, usermod) should now work with both shadow and
|
||||||
|
non-shadow passwords/groups (check for /etc/shadow and /etc/gshadow at
|
||||||
|
run time); a few programs still left to do
|
||||||
|
- mailbox mv/chown/rm in usermod/userdel (suggested by Cristian Gafton)
|
||||||
|
- new contrib/adduser.c from Chris Evans
|
||||||
|
- lots of other minor changes
|
||||||
|
- source tree reorganization, GNU autoconf, portability cleanups
|
||||||
|
- basename() renamed to Basename() to avoid name space confusion
|
||||||
|
- new programs to create /etc/shadow and /etc/gshadow: pwconv5, grpconv
|
||||||
|
- newgrp cleanup and a few fixes
|
||||||
|
- useradd uses PASS_MAX_DAYS, PASS_MIN_DAYS and PASS_WARN_AGE
|
||||||
|
- don't make the first group member the group admin by default
|
||||||
|
(define FIRST_MEMBER_IS_ADMIN to get the old gpasswd behaviour)
|
||||||
|
- password aging constants, NGROUPS_MAX and syslog stuff in only one
|
||||||
|
place (defines.h) instead of repeating it in all source files...
|
||||||
|
- added userdel -r safety check (refuse to remove the home directory
|
||||||
|
if it would result in removing some other user's home directory)
|
||||||
|
- usermod -u now correctly checks for non-unique uid (unless -o)
|
||||||
|
- sync() after updating password files, just to be more safe
|
||||||
|
- "make install" should install /etc/login.defs if it doesn't exist
|
||||||
|
- new option to control what happens if we can't cd to the home directory
|
||||||
|
(DEFAULT_HOME in /etc/login.defs)
|
||||||
|
- enter the home directory as the user, not as root (for NFS etc.)
|
||||||
|
- added check for Slackware bugs (nobody UID -1) in pwck and grpck
|
||||||
|
- new CONSOLE_GROUPS feature (thanks to pacman@tardis.mars.net), it is
|
||||||
|
possible to add specified groups (floppy etc.) for console logins
|
||||||
|
- new faillog feature: lock account for specified (per-user) time since
|
||||||
|
the last failure after exceeding the failure limit
|
||||||
|
- new man pages (gpasswd.1, login.access.5, suauth.5)
|
||||||
|
- fixes in man pages, renamed *.4 to *.5
|
||||||
|
- new "contrib" directory (two adduser programs)
|
||||||
|
- changed some "system" to "feature" #ifdefs (autoconf someday...)
|
||||||
|
- sulogin no longer requires to be run from init, should work from rc
|
||||||
|
scripts too
|
||||||
|
- changes to prevent unshadowing with libc SHADOW_COMPAT (get info
|
||||||
|
using xx_locate(), modify it and call xx_update(), don't write back
|
||||||
|
anything returned by getpwnam() etc.)
|
||||||
|
- stupid bug fixed in lastlog.c
|
||||||
|
- don't move non-directories in "usermod -m"
|
||||||
|
- don't log unknown usernames (passwords mistyped for usernames) (lmain.c)
|
||||||
|
- macros to get around ancient compilers which don't like prototypes
|
||||||
|
- make more use of "const" (not everywhere yet)
|
||||||
|
- added #ifdef AUTH_METHODS - very few people use administrator defined
|
||||||
|
authentication methods because many programs are not aware of them;
|
||||||
|
not supporting them makes the code simpler
|
||||||
|
- new "save" and "restore" Makefile targets, thanks to Rafal Maszkowski
|
||||||
|
- sgetgrent() in libshadow.a is optional, some versions of libc have it,
|
||||||
|
see HAVE_SGETGRENT in config.h (grent.c)
|
||||||
|
- don't use continued lines in /etc/group, the standard getgr*() functions
|
||||||
|
don't support that (grent.c)
|
||||||
|
- removed the third main() argument (according to libc docs, not allowed by
|
||||||
|
POSIX.1 - use environ instead) (lmain.c, smain.c, newgrp.c, sulogin.c)
|
||||||
|
- login access control (lmain.c, login_access.c)
|
||||||
|
- added copyright notice to login_access.c (from logdaemon-5.0)
|
||||||
|
- detailed su access control (smain.c, suauth.c) - thanks to Chris Evans
|
||||||
|
- added closelog() in su before executing the shell (smain.c)
|
||||||
|
- getting current user name changed (smain.c)
|
||||||
|
- "x" instead of "*" in pw_passwd, consistent with pwconv (useradd.c)
|
||||||
|
- getpass() shouldn't return NULL except on errors (getpass.c)
|
||||||
|
- moved isexpired() to isexpired.c (now part of libshadow.a) from age.c
|
||||||
|
- SunOS4-like passwd -e (force change on next login) (isexpired.c, passwd.c)
|
||||||
|
- can use shadow support in new versions of Linux libc instead of libshadow.a,
|
||||||
|
see HAVE_SHADOWPWD, HAVE_SHADOWGRP in config.h.linux (shadow.c, gshadow.c)
|
||||||
|
- "no shadow password" not logged, the same /bin/login should work with both
|
||||||
|
shadow and non-shadow passwords (lmain.c)
|
||||||
|
- some cleanup in various places (lmain.c, passwd.c)
|
||||||
|
- new program to verify username/password pairs, for xlock etc.; it is not
|
||||||
|
installed by default, read the comments first (pwdauth.c)
|
||||||
|
- authentication programs run with empty environment for safety (pwauth.c)
|
||||||
|
- added missing fstat error checks (faillog.c, lastlog.c, setup.c, *io.c)
|
||||||
|
- common code separated from *io.c (commonio.c)
|
||||||
|
- ownership and permissions on password files are now preserved (we may try
|
||||||
|
to make more use of setgid and setuid non-root programs in the future)
|
||||||
|
- added (untested) MD5-based crypt() from FreeBSD (md5crypt.c), see
|
||||||
|
MD5_CRYPT in config.h.linux and MD5_CRYPT_ENAB in login.defs.linux
|
||||||
|
- termios/termio/sgtty macros cleaned up a bit
|
||||||
|
|
||||||
|
shadow-951218 => shadow-960129
|
||||||
|
|
||||||
|
Emergency bug fix release - no new features since 951218. There are many
|
||||||
|
new changes, but this bug really can't wait until they are tested.
|
||||||
|
|
||||||
|
Probably all previous versions of the shadow suite have a serious bug which
|
||||||
|
makes it possible to overwrite the stack by entering very long username at
|
||||||
|
the login prompt. This can give root access to any remote user!
|
||||||
|
|
||||||
|
Changed the maximum size in login.c from BUFSIZ (1024) to 32 (to match
|
||||||
|
size of the array in lmain.c). Aaargh!!!
|
||||||
|
|
||||||
|
shadow-951203 => shadow-951218
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- Linux utmp handling fixes (utmp.c)
|
||||||
|
- last failure date printing fixes (failure.c)
|
||||||
|
- minor fix to compile with USE_CRACKLIB (obscure.c)
|
||||||
|
- eliminated the use of snprintf (env.c, lmain.c, login.c, shell.c, smain.c)
|
||||||
|
- basename.c added, replacing duplicated code in various places
|
||||||
|
- "su -" runs the shell with '-' in argv[0] again (smain.c)
|
||||||
|
- removing at/cron jobs cleaned up (userdel.c)
|
||||||
|
- /etc/gshadow should not be world-readable (sgroupio.c)
|
||||||
|
- if fflush() failed, files were not closed (*io.c)
|
||||||
|
- login prompt is now "hostname login: " on Linux (lmain.c, login.c)
|
||||||
|
- "save" and "restore" targets commented out (don't work) (Makefile.linux)
|
||||||
|
- some minor cleanups for gcc -Wall (unused variables etc.)
|
||||||
|
- removed README.FIRST (copyrights are OK now)
|
||||||
|
- updated ANNOUNCE, README.linux, WISHLIST
|
||||||
|
- as suggested, converted to RCS
|
||||||
|
|
||||||
|
shadow-3.3.2-951127 => shadow-951203-jfh
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- Added the BSD-style copyright to all of the files. Any files with the
|
||||||
|
old copyright have multiple copyright holders and need to be cleanroomed
|
||||||
|
to produce BSD-style copyrightable files, or I need to get the consent
|
||||||
|
of the others to change the copyright.
|
||||||
|
- Changed the ANNOUNCE file to not refer to the README.FIRST file. Now
|
||||||
|
that all of the files should have the correct copyright there is no need
|
||||||
|
to refer to that e-mail message.
|
||||||
|
- Changes SCCS strings to "%W% %U% %G%". Marek needs to either convert to
|
||||||
|
RCS or check into SCCS and then checkout. I'd suggest using RCS ;-)
|
||||||
|
|
||||||
|
jfh@rpp386.cactus.org
|
||||||
|
|
||||||
|
shadow-3.3.2-951106 => shadow-951127
|
||||||
|
|
||||||
|
Note: for now this code only supports Linux. All the #ifdef's are there
|
||||||
|
(and will be; support for at least SunOS 4.1.x would be nice) but:
|
||||||
|
- I had to fix some potential security problems resulting from sloppy
|
||||||
|
coding (no bounds checking), and it was easier for me to use snprintf()
|
||||||
|
(not available on many systems, unfortunately), I'll fix that later.
|
||||||
|
Old versions of Linux libc don't have snprintf() either, and the one
|
||||||
|
in libbsd.a ignores the max size - don't use it! (libc-4.6.27 is OK)
|
||||||
|
- I am lazy and only updated Makefile.linux and config.h.linux this time
|
||||||
|
- I don't have root access to non-Linux systems (this means no testing)
|
||||||
|
- this code needs some major reorganization, which will (hopefully)
|
||||||
|
make porting easier
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- some code cleanup, prototypes.h, defines.h, Makefile and config.h changes
|
||||||
|
- login can be statically linked (not that I think it's a good idea, better
|
||||||
|
fix the telnetd, but paranoid people will like it :-)
|
||||||
|
- login is installed non-setuid by default
|
||||||
|
- check for NULL from getpass()
|
||||||
|
- wipe cleartext password from getpass() when no longer needed (pwauth.c)
|
||||||
|
- use standard "Password: " prompt by default (pwauth.c)
|
||||||
|
- hopefully fixed bogus sigaction() stuff (Linux only) (getpass.c)
|
||||||
|
- oops, setrlimit wants bytes, ulimit wants 512-byte units (lmain.c)
|
||||||
|
- Linux has <lastlog.h>
|
||||||
|
- print ll_host on Linux too (lmain.c)
|
||||||
|
- size checking in various places (setuid root programs, argh!)
|
||||||
|
- preserve TERM from getty (lmain.c)
|
||||||
|
- don't ignore SIGHUP (lmain.c)
|
||||||
|
- :%s/setenv/set_env/g (setenv(3) conflict) (env.c, lmain.c, login.c)
|
||||||
|
- remove LD_xxx (env.c)
|
||||||
|
- use bzero() instead of memset() for BSD portability and less #ifdef's
|
||||||
|
(if the system has no bzero(), implement it as a macro using memset())
|
||||||
|
- the above fixes wrong order of memset() parameters (log.c)
|
||||||
|
- use getutent/pututline instead of doing it by hand (utmp.c)
|
||||||
|
- added the new settings to login.defs.linux
|
||||||
|
- added login_access.c to the distribution (not used yet)
|
||||||
|
|
||||||
|
==========
|
||||||
|
|
||||||
|
shadow-3.3.2 => shadow-3.3.2-951106
|
||||||
|
|
||||||
|
- added dummy pad.c and #ifdef'ed out references to pad_auth (pwauth.c)
|
||||||
|
- malloc/strdup error checking, hopefully no more core dumps...
|
||||||
|
- define HAVE_RLIMIT instead of HAVE_ULIMIT for Linux (config.h.linux)
|
||||||
|
- changed pathnames on Linux to conform to new FSSTND (/var/log etc.)
|
||||||
|
- larger buffer for cipher, for md5 crypt() if and when (encrypt.c, passwd.c)
|
||||||
|
- use POSIX termios whenever possible on Linux
|
||||||
|
- list.c, removed add_list/del_list from gpmain.c, user{add,del,mod}.c
|
||||||
|
- strtoday.c, removed duplicates from chage.c, useradd.c, usermod.c
|
||||||
|
- login -h only for root (lmain.c)
|
||||||
|
- login -r not needed for Linux (lmain.c)
|
||||||
|
- sample login.defs modified for Linux (login.defs.linux)
|
||||||
|
- swapped chfn USAGE and ADMUSAGE (chfn.c)
|
||||||
|
- added -u to passwd usage (passwd.c)
|
||||||
|
- no #! check necessary for Linux (shell.c)
|
||||||
|
- define OLD_CRON for some old incompatible Linux distributions (userdel.c)
|
||||||
|
- PASS_MAX is now 127 (not 8) for Linux (getpass.c)
|
||||||
|
- LOGIN_RETRIES, LOGIN_TIMEOUT, PASS_CHANGE_TRIES are no longer compiled in,
|
||||||
|
can now be set in login.defs, old values are used as defaults (lmain.c)
|
||||||
|
- unique uid/gid selection now more robust (useradd.c, groupadd.c)
|
||||||
|
- UID_MIN, UID_MAX, GID_MIN, GID_MAX in login.defs (useradd.c, groupadd.c)
|
||||||
|
- CRACKLIB_DICTPATH no longer compiled in, can be set in login.defs (passwd.c)
|
||||||
|
- PASS_ALWAYS_WARN: warn about weak passwords even for root (passwd.c)
|
||||||
|
- PASS_MAX_LEN, check truncated passwords again (obscure.c)
|
||||||
|
- check for weak passwords too if previous password was empty (obscure.c)
|
||||||
|
- CHFN_RESTRICT: don't let users change their full names (chfn.c)
|
||||||
|
- Linux has getusershell(), use it (chsh.c)
|
||||||
|
- check if the new shell is executable by the user (chsh.c)
|
||||||
|
- sleep before printing "Login incorrect", not the other way around (lmain.c)
|
||||||
|
- don't be picky about utmp only if any of -rfh flags given (lmain.c)
|
||||||
|
- do "wheel group" more like BSD does (smain.c)
|
||||||
|
- use getlogin() in su (smain.c)
|
||||||
|
- UMASK from login.defs defaults to 077, not 0 (lmain.c, newusers.c)
|
||||||
|
- #undef HAS_ATRM for Linux until atrm can do what we need (config.h.linux)
|
||||||
|
- Linux has most commands in /usr/bin, not /bin (age.c, passwd.c, userdel.c)
|
||||||
|
- ULIMIT from login.defs works on systems using setrlimit() too (lmain.c)
|
||||||
|
- LOGIN_STRING should work now (pwauth.c, getdef.c)
|
||||||
|
- kludge to avoid conflict with Linux <shadow.h> (gshadow.h)
|
||||||
|
- mv Makefile Makefile.xenix ; mv config.h config.h.xenix - so that they are
|
||||||
|
not lost when you copy the right ones to Makefile and config.h
|
||||||
|
|
||||||
|
==========
|
||||||
|
|
||||||
|
shadow-3.3.2
|
||||||
|
|
||||||
|
Original version, received directly from the author.
|
||||||
|
|
||||||
176
doc/INSTALL
Normal file
176
doc/INSTALL
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
|
||||||
|
These are generic installation instructions.
|
||||||
|
|
||||||
|
The `configure' shell script attempts to guess correct values for
|
||||||
|
various system-dependent variables used during compilation. It uses
|
||||||
|
those values to create a `Makefile' in each directory of the package.
|
||||||
|
It may also create one or more `.h' files containing system-dependent
|
||||||
|
definitions. Finally, it creates a shell script `config.status' that
|
||||||
|
you can run in the future to recreate the current configuration, a file
|
||||||
|
`config.cache' that saves the results of its tests to speed up
|
||||||
|
reconfiguring, and a file `config.log' containing compiler output
|
||||||
|
(useful mainly for debugging `configure').
|
||||||
|
|
||||||
|
If you need to do unusual things to compile the package, please try
|
||||||
|
to figure out how `configure' could check whether to do them, and mail
|
||||||
|
diffs or instructions to the address given in the `README' so they can
|
||||||
|
be considered for the next release. If at some point `config.cache'
|
||||||
|
contains results you don't want to keep, you may remove or edit it.
|
||||||
|
|
||||||
|
The file `configure.in' is used to create `configure' by a program
|
||||||
|
called `autoconf'. You only need `configure.in' if you want to change
|
||||||
|
it or regenerate `configure' using a newer version of `autoconf'.
|
||||||
|
|
||||||
|
The simplest way to compile this package is:
|
||||||
|
|
||||||
|
1. `cd' to the directory containing the package's source code and type
|
||||||
|
`./configure' to configure the package for your system. If you're
|
||||||
|
using `csh' on an old version of System V, you might need to type
|
||||||
|
`sh ./configure' instead to prevent `csh' from trying to execute
|
||||||
|
`configure' itself.
|
||||||
|
|
||||||
|
Running `configure' takes a while. While running, it prints some
|
||||||
|
messages telling which features it is checking for.
|
||||||
|
|
||||||
|
2. Type `make' to compile the package.
|
||||||
|
|
||||||
|
3. Optionally, type `make check' to run any self-tests that come with
|
||||||
|
the package.
|
||||||
|
|
||||||
|
4. Type `make install' to install the programs and any data files and
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
5. You can remove the program binaries and object files from the
|
||||||
|
source code directory by typing `make clean'. To also remove the
|
||||||
|
files that `configure' created (so you can compile the package for
|
||||||
|
a different kind of computer), type `make distclean'. There is
|
||||||
|
also a `make maintainer-clean' target, but that is intended mainly
|
||||||
|
for the package's developers. If you use it, you may have to get
|
||||||
|
all sorts of other programs in order to regenerate files that came
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
Compilers and Options
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Some systems require unusual options for compilation or linking that
|
||||||
|
the `configure' script does not know about. You can give `configure'
|
||||||
|
initial values for variables by setting them in the environment. Using
|
||||||
|
a Bourne-compatible shell, you can do that on the command line like
|
||||||
|
this:
|
||||||
|
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
||||||
|
|
||||||
|
Or on systems that have the `env' program, you can do it like this:
|
||||||
|
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
||||||
|
|
||||||
|
Compiling For Multiple Architectures
|
||||||
|
====================================
|
||||||
|
|
||||||
|
You can compile the package for more than one kind of computer at the
|
||||||
|
same time, by placing the object files for each architecture in their
|
||||||
|
own directory. To do this, you must use a version of `make' that
|
||||||
|
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
||||||
|
directory where you want the object files and executables to go and run
|
||||||
|
the `configure' script. `configure' automatically checks for the
|
||||||
|
source code in the directory that `configure' is in and in `..'.
|
||||||
|
|
||||||
|
If you have to use a `make' that does not supports the `VPATH'
|
||||||
|
variable, you have to compile the package for one architecture at a time
|
||||||
|
in the source code directory. After you have installed the package for
|
||||||
|
one architecture, use `make distclean' before reconfiguring for another
|
||||||
|
architecture.
|
||||||
|
|
||||||
|
Installation Names
|
||||||
|
==================
|
||||||
|
|
||||||
|
By default, `make install' will install the package's files in
|
||||||
|
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
||||||
|
installation prefix other than `/usr/local' by giving `configure' the
|
||||||
|
option `--prefix=PATH'.
|
||||||
|
|
||||||
|
You can specify separate installation prefixes for
|
||||||
|
architecture-specific files and architecture-independent files. If you
|
||||||
|
give `configure' the option `--exec-prefix=PATH', the package will use
|
||||||
|
PATH as the prefix for installing programs and libraries.
|
||||||
|
Documentation and other data files will still use the regular prefix.
|
||||||
|
|
||||||
|
If the package supports it, you can cause programs to be installed
|
||||||
|
with an extra prefix or suffix on their names by giving `configure' the
|
||||||
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||||
|
|
||||||
|
Optional Features
|
||||||
|
=================
|
||||||
|
|
||||||
|
Some packages pay attention to `--enable-FEATURE' options to
|
||||||
|
`configure', where FEATURE indicates an optional part of the package.
|
||||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||||
|
is something like `gnu-as' or `x' (for the X Window System). The
|
||||||
|
`README' should mention any `--enable-' and `--with-' options that the
|
||||||
|
package recognizes.
|
||||||
|
|
||||||
|
For packages that use the X Window System, `configure' can usually
|
||||||
|
find the X include and library files automatically, but if it doesn't,
|
||||||
|
you can use the `configure' options `--x-includes=DIR' and
|
||||||
|
`--x-libraries=DIR' to specify their locations.
|
||||||
|
|
||||||
|
Specifying the System Type
|
||||||
|
==========================
|
||||||
|
|
||||||
|
There may be some features `configure' can not figure out
|
||||||
|
automatically, but needs to determine by the type of host the package
|
||||||
|
will run on. Usually `configure' can figure that out, but if it prints
|
||||||
|
a message saying it can not guess the host type, give it the
|
||||||
|
`--host=TYPE' option. TYPE can either be a short name for the system
|
||||||
|
type, such as `sun4', or a canonical name with three fields:
|
||||||
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
See the file `config.sub' for the possible values of each field. If
|
||||||
|
`config.sub' isn't included in this package, then this package doesn't
|
||||||
|
need to know the host type.
|
||||||
|
|
||||||
|
If you are building compiler tools for cross-compiling, you can also
|
||||||
|
use the `--target=TYPE' option to select the type of system they will
|
||||||
|
produce code for and the `--build=TYPE' option to select the type of
|
||||||
|
system on which you are compiling the package.
|
||||||
|
|
||||||
|
Sharing Defaults
|
||||||
|
================
|
||||||
|
|
||||||
|
If you want to set default values for `configure' scripts to share,
|
||||||
|
you can create a site shell script called `config.site' that gives
|
||||||
|
default values for variables like `CC', `cache_file', and `prefix'.
|
||||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||||
|
`CONFIG_SITE' environment variable to the location of the site script.
|
||||||
|
A warning: not all `configure' scripts look for a site script.
|
||||||
|
|
||||||
|
Operation Controls
|
||||||
|
==================
|
||||||
|
|
||||||
|
`configure' recognizes the following options to control how it
|
||||||
|
operates.
|
||||||
|
|
||||||
|
`--cache-file=FILE'
|
||||||
|
Use and save the results of the tests in FILE instead of
|
||||||
|
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
||||||
|
debugging `configure'.
|
||||||
|
|
||||||
|
`--help'
|
||||||
|
Print a summary of the options to `configure', and exit.
|
||||||
|
|
||||||
|
`--quiet'
|
||||||
|
`--silent'
|
||||||
|
`-q'
|
||||||
|
Do not print messages saying which checks are being made.
|
||||||
|
|
||||||
|
`--srcdir=DIR'
|
||||||
|
Look for the package's source code in directory DIR. Usually
|
||||||
|
`configure' can determine that directory automatically.
|
||||||
|
|
||||||
|
`--version'
|
||||||
|
Print the version of Autoconf used to generate the `configure'
|
||||||
|
script, and exit.
|
||||||
|
|
||||||
|
`configure' also accepts some other, not widely useful, options.
|
||||||
|
|
||||||
118
doc/LICENSE
Normal file
118
doc/LICENSE
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
NOTE:
|
||||||
|
This license has been obsoleted by the change to the BSD-style copyright.
|
||||||
|
You may continue to use this license if you wish, but you are under no
|
||||||
|
obligation to do so.
|
||||||
|
|
||||||
|
(*
|
||||||
|
This document is freely plagiarised from the 'Artistic Licence',
|
||||||
|
distributed as part of the Perl v4.0 kit by Larry Wall, which is
|
||||||
|
available from most major archive sites. I stole it from CrackLib.
|
||||||
|
|
||||||
|
$Id: LICENSE,v 1.2 1997/05/01 23:14:30 marekm Exp $
|
||||||
|
*)
|
||||||
|
|
||||||
|
This documents purpose is to state the conditions under which this
|
||||||
|
Package (See definition below) viz: "Shadow", the Shadow Password Suite
|
||||||
|
which is held by Julianne Frances Haugh, may be copied, such that the
|
||||||
|
copyright holder maintains some semblance of artistic control over the
|
||||||
|
development of the package, while giving the users of the package the
|
||||||
|
right to use and distribute the Package in a more-or-less customary
|
||||||
|
fashion, plus the right to make reasonable modifications.
|
||||||
|
|
||||||
|
So there.
|
||||||
|
|
||||||
|
***************************************************************************
|
||||||
|
|
||||||
|
Definitions:
|
||||||
|
|
||||||
|
|
||||||
|
A "Package" refers to the collection of files distributed by the
|
||||||
|
Copyright Holder, and derivatives of that collection of files created
|
||||||
|
through textual modification, or segments thereof.
|
||||||
|
|
||||||
|
"Standard Version" refers to such a Package if it has not been modified,
|
||||||
|
or has been modified in accordance with the wishes of the Copyright
|
||||||
|
Holder.
|
||||||
|
|
||||||
|
"Copyright Holder" is whoever is named in the copyright or copyrights
|
||||||
|
for the package.
|
||||||
|
|
||||||
|
"You" is you, if you're thinking about copying or distributing this
|
||||||
|
Package.
|
||||||
|
|
||||||
|
"Reasonable copying fee" is whatever you can justify on the basis of
|
||||||
|
media cost, duplication charges, time of people involved, and so on.
|
||||||
|
(You will not be required to justify it to the Copyright Holder, but
|
||||||
|
only to the computing community at large as a market that must bear the
|
||||||
|
fee.)
|
||||||
|
|
||||||
|
"Freely Available" means that no fee is charged for the item itself,
|
||||||
|
though there may be fees involved in handling the item. It also means
|
||||||
|
that recipients of the item may redistribute it under the same
|
||||||
|
conditions they received it.
|
||||||
|
|
||||||
|
|
||||||
|
1. You may make and give away verbatim copies of the source form of the
|
||||||
|
Standard Version of this Package without restriction, provided that you
|
||||||
|
duplicate all of the original copyright notices and associated
|
||||||
|
disclaimers.
|
||||||
|
|
||||||
|
2. You may apply bug fixes, portability fixes and other modifications
|
||||||
|
derived from the Public Domain or from the Copyright Holder. A Package
|
||||||
|
modified in such a way shall still be considered the Standard Version.
|
||||||
|
|
||||||
|
3. You may otherwise modify your copy of this Package in any way,
|
||||||
|
provided that you insert a prominent notice in each changed file stating
|
||||||
|
how and when AND WHY you changed that file, and provided that you do at
|
||||||
|
least ONE of the following:
|
||||||
|
|
||||||
|
a) place your modifications in the Public Domain or otherwise make them
|
||||||
|
Freely Available, such as by posting said modifications to Usenet or an
|
||||||
|
equivalent medium, or placing the modifications on a major archive site
|
||||||
|
such as uunet.uu.net, or by allowing the Copyright Holder to include
|
||||||
|
your modifications in the Standard Version of the Package.
|
||||||
|
|
||||||
|
b) use the modified Package only within your corporation or organization.
|
||||||
|
|
||||||
|
c) rename any non-standard executables so the names do not conflict with
|
||||||
|
standard executables, which must also be provided, and provide separate
|
||||||
|
documentation for each non-standard executable that clearly documents
|
||||||
|
how it differs from the Standard Version.
|
||||||
|
|
||||||
|
d) make other distribution arrangements with the Copyright Holder.
|
||||||
|
|
||||||
|
4. You may distribute the programs of this Package in object code or
|
||||||
|
executable form, provided that you do at least ONE of the following:
|
||||||
|
|
||||||
|
a) distribute a Standard Version of the executables and library files,
|
||||||
|
together with instructions (in the manual page or equivalent) on where
|
||||||
|
to get the Standard Version.
|
||||||
|
|
||||||
|
b) accompany the distribution with the machine-readable source of the
|
||||||
|
Package with your modifications.
|
||||||
|
|
||||||
|
c) accompany any non-standard executables with their corresponding
|
||||||
|
Standard Version executables, giving the non-standard executables
|
||||||
|
non-standard names, and clearly documenting the differences in manual
|
||||||
|
pages (or equivalent), together with instructions on where to get the
|
||||||
|
Standard Version.
|
||||||
|
|
||||||
|
d) make other distribution arrangements with the Copyright Holder.
|
||||||
|
|
||||||
|
5. You may charge a reasonable copying fee for any distribution of this
|
||||||
|
Package. You may charge any fee you choose for support of this Package.
|
||||||
|
YOU MAY NOT CHARGE A FEE FOR THIS PACKAGE ITSELF. However, you may
|
||||||
|
distribute this Package in aggregate with other (possibly commercial)
|
||||||
|
programs as part of a larger (possibly commercial) software distribution
|
||||||
|
provided that YOU DO NOT ADVERTISE this package as a product of your
|
||||||
|
own.
|
||||||
|
|
||||||
|
6. The name of the Copyright Holder may not be used to endorse or
|
||||||
|
promote products derived from this software without specific prior
|
||||||
|
written permission.
|
||||||
|
|
||||||
|
7. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||||
|
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
The End
|
||||||
19
doc/LSM
Normal file
19
doc/LSM
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
Begin3
|
||||||
|
Title: Shadow Password Suite
|
||||||
|
Version: 19990709
|
||||||
|
Entered-date: 09JUL99
|
||||||
|
Description: Shadow password file utilities. This package includes
|
||||||
|
the programs necessary to convert traditional V7 UNIX
|
||||||
|
password files to the SVR4 shadow password format, and
|
||||||
|
additional tools to maintain password and group files
|
||||||
|
(that work with both shadow and non-shadow passwords).
|
||||||
|
Keywords: login passwd security shadow
|
||||||
|
Author: jfh@bga.com (Julianne F. Haugh)
|
||||||
|
Maintained-by: marekm@linux.org.pl (Marek Michalkiewicz)
|
||||||
|
Primary-site: piast.t19.ds.pwr.wroc.pl /pub/linux/shadow/
|
||||||
|
624K shadow-19990709.tar.gz
|
||||||
|
Alternate-site: ftp.ists.pwr.wroc.pl /pub/linux/shadow/
|
||||||
|
Original-site: ftp.uu.net ?
|
||||||
|
Platforms: Linux, SunOS, ...
|
||||||
|
Copying-policy: FRS
|
||||||
|
End
|
||||||
7
doc/Makefile.am
Normal file
7
doc/Makefile.am
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
EXTRA_DIST = ANNOUNCE CHANGES HOWTO LICENSE LSM README README.debian \
|
||||||
|
README.limits README.linux README.mirrors README.nls README.pam \
|
||||||
|
README.platforms README.shadow-paper README.sun4 \
|
||||||
|
WISHLIST console.c.spec.txt cracklib26.diff
|
||||||
198
doc/Makefile.in
Normal file
198
doc/Makefile.in
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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.
|
||||||
|
|
||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
DISTDIR =
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = ..
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CATALOGS = @CATALOGS@
|
||||||
|
CATOBJEXT = @CATOBJEXT@
|
||||||
|
CC = @CC@
|
||||||
|
CPP = @CPP@
|
||||||
|
DATADIRNAME = @DATADIRNAME@
|
||||||
|
GENCAT = @GENCAT@
|
||||||
|
GMOFILES = @GMOFILES@
|
||||||
|
GMSGFMT = @GMSGFMT@
|
||||||
|
GT_NO = @GT_NO@
|
||||||
|
GT_YES = @GT_YES@
|
||||||
|
INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
|
||||||
|
INSTOBJEXT = @INSTOBJEXT@
|
||||||
|
INTLDEPS = @INTLDEPS@
|
||||||
|
INTLLIBS = @INTLLIBS@
|
||||||
|
INTLOBJS = @INTLOBJS@
|
||||||
|
LD = @LD@
|
||||||
|
LIBCRACK = @LIBCRACK@
|
||||||
|
LIBCRYPT = @LIBCRYPT@
|
||||||
|
LIBPAM = @LIBPAM@
|
||||||
|
LIBSKEY = @LIBSKEY@
|
||||||
|
LIBTCFS = @LIBTCFS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
|
MSGFMT = @MSGFMT@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
POFILES = @POFILES@
|
||||||
|
POSUB = @POSUB@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
U = @U@
|
||||||
|
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
||||||
|
USE_NLS = @USE_NLS@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
YACC = @YACC@
|
||||||
|
l = @l@
|
||||||
|
|
||||||
|
EXTRA_DIST = ANNOUNCE CHANGES HOWTO LICENSE LSM README README.debian \
|
||||||
|
README.limits README.linux README.mirrors README.nls README.pam \
|
||||||
|
README.platforms README.shadow-paper README.sun4 \
|
||||||
|
WISHLIST console.c.spec.txt cracklib26.diff
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = ../config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
DIST_COMMON = README INSTALL Makefile.am Makefile.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
all: Makefile
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
|
|
||||||
|
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
|
||||||
|
subdir = doc
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
info:
|
||||||
|
dvi:
|
||||||
|
check: all
|
||||||
|
$(MAKE)
|
||||||
|
installcheck:
|
||||||
|
install-exec:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-exec install-data all
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs:
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean: mostlyclean-generic
|
||||||
|
|
||||||
|
clean: clean-generic mostlyclean
|
||||||
|
|
||||||
|
distclean: distclean-generic clean
|
||||||
|
-rm -f config.status
|
||||||
|
-rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-generic distclean
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
.PHONY: tags distdir info dvi installcheck install-exec install-data \
|
||||||
|
install uninstall all installdirs mostlyclean-generic distclean-generic \
|
||||||
|
clean-generic maintainer-clean-generic clean mostlyclean distclean \
|
||||||
|
maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
253
doc/README
Normal file
253
doc/README
Normal file
@@ -0,0 +1,253 @@
|
|||||||
|
[ $Id: README,v 1.3 1998/12/28 20:34:27 marekm Exp $ ]
|
||||||
|
|
||||||
|
This is the explanatory document for Julianne Frances Haugh's login
|
||||||
|
replacement, release 3. This document was last updated 16 Feb 1997.
|
||||||
|
|
||||||
|
This software is copyright 1988 - 1997, Julianne F. Haugh. All rights
|
||||||
|
reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. Neither the name of Julianne F. Haugh nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY JULIE HAUGH AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL JULIE HAUGH OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
|
This source code is currently archived on ftp.uu.net in the
|
||||||
|
comp.sources.misc portion of the USENET archives. You may also contact
|
||||||
|
the author, Julianne F. Haugh, at jfh@bga.com if you have any questions
|
||||||
|
regarding this package.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS BEING DISTRIBUTED AS-IS. THE AUTHORS DISCLAIM ALL
|
||||||
|
LIABILITY FOR ANY CONSEQUENCES OF USE. THE USER IS SOLELY RESPONSIBLE
|
||||||
|
FOR THE MAINTENANCE OF THIS SOFTWARE PACKAGE. THE AUTHORS ARE UNDER NO
|
||||||
|
OBLIGATION TO PROVIDE MODIFICATIONS OR IMPROVEMENTS. THE USER IS
|
||||||
|
ENCOURAGED TO TAKE ANY AND ALL STEPS NEEDED TO PROTECT AGAINST ACCIDENTAL
|
||||||
|
LOSS OF INFORMATION OR MACHINE RESOURCES.
|
||||||
|
|
||||||
|
Special thanks are due to Chip Rosenthal for his fine testing efforts;
|
||||||
|
to Steve Simmons for his work in porting this code to BSD; and to Bill
|
||||||
|
Kennedy for his contributions of LaserJet printer time and energies.
|
||||||
|
Also, thanks for Dennis L. Mumaugh for the initial shadow password
|
||||||
|
information and to Tony Walton (olapw@olgb1.oliv.co.uk) for the System
|
||||||
|
V Release 4 changes. Effort in porting to SunOS has been contributed
|
||||||
|
by Dr. Michael Newberry (miken@cs.adfa.oz.au) and Micheal J. Miller, Jr.
|
||||||
|
(mke@kaberd.rain.com). Effort in porting to AT&T UNIX System V Release
|
||||||
|
4 has been provided by Andrew Herbert (andrew@werple.pub.uu.oz.au).
|
||||||
|
Special thanks to Marek Michalkiewicz (marekm@i17linuxb.ists.pwr.wroc.pl)
|
||||||
|
for taking over the Linux port of this software.
|
||||||
|
|
||||||
|
New for Release 3.3:
|
||||||
|
User-defined authentication has been added. This allows you to
|
||||||
|
write programs to replace the password authentication method
|
||||||
|
which uses the crypt() function.
|
||||||
|
|
||||||
|
The CrackLib password checking library is supported as of release
|
||||||
|
3.3.0. It allows you to perform pro-active password checking as
|
||||||
|
each password is changed.
|
||||||
|
|
||||||
|
Warning:
|
||||||
|
The newuser command will be removed in a later release.
|
||||||
|
The libsec.a library will be removed at some point after
|
||||||
|
version 3.3.3.
|
||||||
|
|
||||||
|
This software is described in the 3rd USENIX Security Symposium
|
||||||
|
proceedings. These proceedings are available from
|
||||||
|
|
||||||
|
USENIX Association
|
||||||
|
2560 Ninth Street, Suite 215
|
||||||
|
Berkeley, CA 94710
|
||||||
|
|
||||||
|
The current price is $30 for USENIX members and $39 for non-members.
|
||||||
|
|
||||||
|
Begin by reading and editing the config.h file. All options are selected
|
||||||
|
by using #define's. A brief description for each available option appears
|
||||||
|
below. You may want to print this file out as it is LONG and you will
|
||||||
|
need to refer to it while editting config.h. You will also have to edit
|
||||||
|
the Makefile. The possible differences are documented there. Pay close
|
||||||
|
attention to the install: rule. Login now runs on about 30 different
|
||||||
|
varieties of UNIX that I have been made aware of. If you have any qualms,
|
||||||
|
you should run "make save" before running "make install". If something
|
||||||
|
breaks you can use "make restore" to put things back. In any case, you
|
||||||
|
should have a recent system backup as the potential for serious damage
|
||||||
|
exists.
|
||||||
|
|
||||||
|
There are special Makefile and config.h files for SVR4, SunOS 4.1, and
|
||||||
|
Linux systems. If there is a major UNIX variant that you would like to
|
||||||
|
see supported, please send working Makefile and config.h files and I will
|
||||||
|
try to include then in the base distribution.
|
||||||
|
|
||||||
|
Note that there are MANY options. As distributed most options are turned
|
||||||
|
on, which produces a really nice package. This is the system as used on
|
||||||
|
some of the authors' machines. There are many options which may be
|
||||||
|
selected at run time. You should refer to the login.5 manual page for
|
||||||
|
more information regarding these options.
|
||||||
|
|
||||||
|
There are several files which you may have to replace. If your system has
|
||||||
|
a lastlog.h file, you should replace the one which I provide with your
|
||||||
|
system version. The pwd.h file that is produced by "make" must agree
|
||||||
|
exactly with the system supplied version. You should re-arrange the
|
||||||
|
fields or #define's until they match. The same is true for "shadow.h",
|
||||||
|
if you system provides one. You may want to replace large portions of
|
||||||
|
that file (or the entire file) with your system version. It is provided
|
||||||
|
for those systems which do NOT provide /usr/include/shadow.h. If you
|
||||||
|
do not have a the crypt() function in your library (perhaps because you
|
||||||
|
are located outside the United States), you may wish to look into the
|
||||||
|
UFC-crypt package which was posted to comp.sources.misc in volume 23,
|
||||||
|
issues 97 and 98.
|
||||||
|
|
||||||
|
Login Defaults File -
|
||||||
|
This option selects the name of the file to read for the
|
||||||
|
run-time configurable options. The default value for
|
||||||
|
LOGINDEFS is "/etc/login.defs".
|
||||||
|
|
||||||
|
Shadow [ unreadable ] Password Files -
|
||||||
|
This option utilizes an alternate, non-readable file to
|
||||||
|
contain the actual encrypted passwords. This is presumed
|
||||||
|
to increase system security by increasing the difficulty
|
||||||
|
with which system crackers obtain encrypted passwords.
|
||||||
|
|
||||||
|
Select this option by defining the SHADOWPWD macro.
|
||||||
|
|
||||||
|
This feature is optional, but only certain commands may
|
||||||
|
be compiled with this option disabled.
|
||||||
|
|
||||||
|
Shadow Group Files -
|
||||||
|
This option utilizes an alternate, non-readable file to
|
||||||
|
contain encrypted group passwords and group administrator
|
||||||
|
information.
|
||||||
|
|
||||||
|
This feature allows one or more users to be defined as
|
||||||
|
the administrators of a group for the purpose of adding
|
||||||
|
or deleting members and changing the group password.
|
||||||
|
|
||||||
|
Select this option by defining the SHADOWGRP macro. You
|
||||||
|
must also create an emptry /etc/gshadow file. You must
|
||||||
|
select the SHADOWPWD option if you select SHADOWGRP.
|
||||||
|
|
||||||
|
DBM Password Files -
|
||||||
|
This option utilizes the DBM database access routines to
|
||||||
|
increase the performance of user name and ID lookups in the
|
||||||
|
password file. You may select the NDBM database instead
|
||||||
|
and have DBM-style access to all user information files.
|
||||||
|
|
||||||
|
Select this option by defining both the DBM and GETPWENT
|
||||||
|
macros. The FGETPWENT macro must also be defined or the
|
||||||
|
fgetpwent() library routine must be present.
|
||||||
|
|
||||||
|
Double Length Passwords -
|
||||||
|
This option extends the maximum length of a user password
|
||||||
|
to 16 characters from eight.
|
||||||
|
|
||||||
|
Select this option by defining the DOUBLESIZE macro.
|
||||||
|
Credit for this option is due Jonathan Bayer.
|
||||||
|
|
||||||
|
Password Aging -
|
||||||
|
This option includes code to perform password aging.
|
||||||
|
Password aging is presumed to increase system security
|
||||||
|
by forcing users to change passwords on a regular
|
||||||
|
basis. The resolution on password age is in weeks for
|
||||||
|
non-shadow password systems and in days otherwise.
|
||||||
|
|
||||||
|
Select this option by defining the AGING macro.
|
||||||
|
|
||||||
|
Syslog -
|
||||||
|
This option causes the code to log various errors or
|
||||||
|
special conditions to the syslog daemon. The types of
|
||||||
|
information that are logged security violations, changes
|
||||||
|
to the user database, and program errors.
|
||||||
|
|
||||||
|
Select syslog processing by defining the USE_SYSLOG
|
||||||
|
macro.
|
||||||
|
|
||||||
|
Remote Login -
|
||||||
|
This option causes certain network login code to be
|
||||||
|
inserted to enable the "rlogin" and "telnet" commands to
|
||||||
|
work. To enable network logins, define the RLOGIN macro.
|
||||||
|
If your <utmp.h> file includes a ut_host member, you must
|
||||||
|
also define the UT_HOST macro. Note that SVR4 has a
|
||||||
|
"utmpx" file to hold the ut_host member, so UT_HOST is
|
||||||
|
not required.
|
||||||
|
|
||||||
|
Directory Reading Routines -
|
||||||
|
Three different macros are defined for opening and reading
|
||||||
|
directories. They are DIR_XENIX, DIR_BSD, and DIR_SYSV.
|
||||||
|
Refer to config.h for more details.
|
||||||
|
|
||||||
|
Library Configuration Macros -
|
||||||
|
The following macros define the functions which are present
|
||||||
|
in your system library:
|
||||||
|
|
||||||
|
HAVE_ULIMIT - Define if your UNIX supports ulimit()
|
||||||
|
GETPWENT - Define if you want my GETPWENT(3) routines
|
||||||
|
GETGRENT - Define if you want my GETGRENT(3) routines
|
||||||
|
NEED_AL64 - Define if library does not include a64l()
|
||||||
|
NEED_MKDIR - Define if system does not have mkdir()
|
||||||
|
NEED_RMDIR - Define if system does not have rmdir()
|
||||||
|
NEED_RENAME - Define if system does not have rename()
|
||||||
|
NEED_STRSTR - Define if library does not include strstr()
|
||||||
|
|
||||||
|
Password File Information -
|
||||||
|
The following macros define the fields which are present in
|
||||||
|
your system password file. Because the system was compiled
|
||||||
|
to use the password file in its original form, these macros
|
||||||
|
must agree with the actual contents of the file.
|
||||||
|
|
||||||
|
BSD_QUOTA - the pw_quota field exists
|
||||||
|
ATT_AGE - the pw_age field exists
|
||||||
|
ATT_COMMENT - the pw_comment field exists
|
||||||
|
|
||||||
|
Signal Return Type -
|
||||||
|
Because different systems return different data types for
|
||||||
|
the signal() system call, you must define SIGTYPE to be
|
||||||
|
the data type your system uses. The default is "int", but
|
||||||
|
"void" is another popular value.
|
||||||
|
|
||||||
|
SunOS 4.1.1 Notes: (mke@kaberd.rain.com) Michael J. Miller Jr.
|
||||||
|
|
||||||
|
[ These notes were edited from the original. The standard Makefile
|
||||||
|
and config.h have notes indicating the changes required for SunOS.
|
||||||
|
Steve Allen at Lick has been working on cleaning up this platform. ]
|
||||||
|
|
||||||
|
You'll need to do the following to get the shadow password dist to
|
||||||
|
compile on a sun 4.1.1 system.
|
||||||
|
|
||||||
|
If using csh, then type 'rehash'. cd to the /etc directory and type
|
||||||
|
'pwconv'. This will create two files, nshadow and npasswd.
|
||||||
|
now type 'mkpasswd -f nshadow' and 'mkpasswd -f npasswd'. This will
|
||||||
|
create the shadow password file.
|
||||||
|
|
||||||
|
Note: ftp will still use the old password file. Modified versions of
|
||||||
|
ftpd are available, or you may modify the version of ftpd from
|
||||||
|
any of the freely redistributable ftpd clones.
|
||||||
|
|
||||||
|
Note: If you run suns pcnfs, be aware that it will still be looking at the
|
||||||
|
old password file as well. I may work out a patch for this, as I am
|
||||||
|
fairly certain the stuff on the sun side comes with source.
|
||||||
|
|
||||||
|
Note: I have compiled this package with the standard c compiler and
|
||||||
|
suns unbundled c compiler at an optomization level of 2 in
|
||||||
|
both casses. Haven't tried gcc yet, so I don't know wether it
|
||||||
|
works. Same goes for suns C++ compiler.
|
||||||
|
|
||||||
|
Note: Has been compiled on a sun 3/75 running sunos 4.1.1. Should compile
|
||||||
|
fine on sun 4's running 4.1.1, and may compile on suns running
|
||||||
|
4.1. Have no idea what sort of success people will have that
|
||||||
|
are running 4.03 and older versions.
|
||||||
68
doc/README.debian
Normal file
68
doc/README.debian
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
Read this file first for a brief overview of the new versions of login
|
||||||
|
and passwd.
|
||||||
|
|
||||||
|
|
||||||
|
---Shadow passwords
|
||||||
|
|
||||||
|
The command `shadowconfig on' will turn on shadow password support.
|
||||||
|
`shadowconfig off' will turn it back off. If you turn on shadow
|
||||||
|
password support, you'll gain the ability to set password ages and
|
||||||
|
expirations with chage(1).
|
||||||
|
|
||||||
|
You may want to install the secure-su package which allows more
|
||||||
|
restrictions on su, for example a wheel group.
|
||||||
|
|
||||||
|
|
||||||
|
---General configuration
|
||||||
|
|
||||||
|
Most of the configuration for the shadow utilities is in
|
||||||
|
/etc/login.defs. See login.defs(5). The defaults are quite
|
||||||
|
reasonable.
|
||||||
|
|
||||||
|
|
||||||
|
---MD5 Encryption
|
||||||
|
|
||||||
|
If you set MD5_CRYPT_ENAB=yes in /etc/login.defs, passwords will be
|
||||||
|
encrypted with an MD5-based algorithm. It also supports of passwords
|
||||||
|
of unlimited length and longer salt strings.
|
||||||
|
|
||||||
|
|
||||||
|
---Login and resource control
|
||||||
|
|
||||||
|
/etc/login.access and /etc/porttime control who may login to which
|
||||||
|
ports and when they may login. To enforce time restrictions, you'll
|
||||||
|
need to run logoutd. /etc/init.d/logoutd will start it on bootup if
|
||||||
|
there are non-comment lines in /etc/portttime.
|
||||||
|
|
||||||
|
The lastlog and faillog commands will report the last time a user had
|
||||||
|
a successful and failed login, respectively.
|
||||||
|
|
||||||
|
You may set per-user resource limits by editing /etc/limits. See
|
||||||
|
limits(5).
|
||||||
|
|
||||||
|
|
||||||
|
---Adding users and groups
|
||||||
|
|
||||||
|
Though you may add users and groups with the SysV type commands,
|
||||||
|
useradd and groupadd, I recommend you add them with Debian adduser
|
||||||
|
version 3+. adduser gives you more configuration and conforms to the
|
||||||
|
Debian UID and GID allocation.
|
||||||
|
|
||||||
|
Editing user and group parameters can be done with usermod and
|
||||||
|
groupmod. Removing users and groups can be done with userdel and
|
||||||
|
groupdel.
|
||||||
|
|
||||||
|
|
||||||
|
--- Group administration
|
||||||
|
|
||||||
|
Local group allocation is much easier. With gpasswd(1) you can
|
||||||
|
designate users to administer groups. They can then securely add or
|
||||||
|
remove users from the group.
|
||||||
|
|
||||||
|
|
||||||
|
--- What to read next?
|
||||||
|
|
||||||
|
Read the manpages, the other files in this directory, and the Shadow
|
||||||
|
Password HOWTO (included in the doc-linux package). A large portion
|
||||||
|
of these files deals with getting shadow installed. You can, of
|
||||||
|
course, ignore those parts.
|
||||||
66
doc/README.limits
Normal file
66
doc/README.limits
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
ABOUT shadow-login limits:
|
||||||
|
|
||||||
|
This code is merged into shadow login program from the original LShell 2.01
|
||||||
|
written by Joel Katz. The port and some additional features have been added
|
||||||
|
by Cristian Gafton (gafton@sorosis.ro).
|
||||||
|
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
- 96/04/16
|
||||||
|
- {spaces,tabs} allowed within limits string
|
||||||
|
- Warn via syslog multiple default limits
|
||||||
|
- added few paragraphs to the login man page
|
||||||
|
- 96/04/14
|
||||||
|
- code merged into lmain.c --cristiang
|
||||||
|
|
||||||
|
TODO: - support groups in the limits file
|
||||||
|
(only usernames are supported at this momment :-( )
|
||||||
|
|
||||||
|
Setting user limits for shadow login program
|
||||||
|
|
||||||
|
First, make a root-only-readable file (/etc/limits by default or LIMITS_FILE
|
||||||
|
defined config.h) that describes the resource limits you wish to impose. By
|
||||||
|
default no quotas are imposed on 'root'. In fact, there is no way to impose
|
||||||
|
limits via this procedure to root-equiv accounts (accounts with UID 0).
|
||||||
|
|
||||||
|
Each line describes a limit for a user in the form:
|
||||||
|
|
||||||
|
user LIMITS_STRING
|
||||||
|
|
||||||
|
The LIMITS_STRING is a string of a concatenated list of resource limits.
|
||||||
|
Each limit consists of a letter identifier followed by a numerical limit.
|
||||||
|
The valid identifiers are:
|
||||||
|
|
||||||
|
A: max address space (KB)
|
||||||
|
C: max core file size (KB)
|
||||||
|
D: max data size (KB)
|
||||||
|
F: maximum filesize (KB)
|
||||||
|
M: max locked-in-memory address space (KB)
|
||||||
|
N: max number of open files
|
||||||
|
R: max resident set size (KB)
|
||||||
|
S: max stack size (KB)
|
||||||
|
T: max CPU time (MIN)
|
||||||
|
U: max number of processes
|
||||||
|
L: max number of logins for this user
|
||||||
|
|
||||||
|
For example, L2D2048N5 is a valid LIMITS_STRING. For reading convenience,
|
||||||
|
the following entries are equivalent:
|
||||||
|
|
||||||
|
username L2D2048N5
|
||||||
|
username L2 D2048 N5
|
||||||
|
|
||||||
|
Be aware that after <username> the rest of the line is considered a limit
|
||||||
|
string, thus comments are not allowed. A invalid limits string will be
|
||||||
|
rejected (not considered) by the login program.
|
||||||
|
|
||||||
|
The default entry is denoted by username '*'. If you have multiple 'default'
|
||||||
|
entries in your LIMITS_FILE, then the last one will be used as the default
|
||||||
|
entry.
|
||||||
|
|
||||||
|
To completely disable limits for a user, a single dash (-) will do.
|
||||||
|
|
||||||
|
Also, please note that all limit settings are set PER LOGIN. They are
|
||||||
|
not global, nor are they permanent. Perhaps global limits will come, but
|
||||||
|
for now this will have to do ;)
|
||||||
|
|
||||||
162
doc/README.linux
Normal file
162
doc/README.linux
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
$Id: README.linux,v 1.19 1999/06/07 16:40:44 marekm Exp $
|
||||||
|
|
||||||
|
This is the shadow suite hacked a bit for Linux. See CHANGES for
|
||||||
|
short description of changes. See also WISHLIST if you have too
|
||||||
|
much time on your hands :-). Now that copyright issues have been
|
||||||
|
resolved, the most important thing is testing. Please test this
|
||||||
|
code as much as you can, and report any problems. At this point,
|
||||||
|
I made so many changes that any bugs are probably mine.
|
||||||
|
|
||||||
|
This package uses GNU autoconf, so it should be quite portable
|
||||||
|
- but it hasn't been tested much on anything but Linux/x86.
|
||||||
|
Long time ago, it has been reported to work on SunOS 4.1.x,
|
||||||
|
and recently there has been some success on Solaris 2.x and Irix.
|
||||||
|
I'd like to compile a current list of platforms this package is
|
||||||
|
known to work on - if you get it to work on some new OS (non-x86
|
||||||
|
Linux, or non-Linux), please let me know. Please specify: host
|
||||||
|
type guessed by autoconf, libc version, distribution, changes
|
||||||
|
you needed to make (if any), etc. Please see README.platforms
|
||||||
|
for the current (incomplete - I know there are more...) list of
|
||||||
|
platforms this package is known to work on.
|
||||||
|
|
||||||
|
There is a developers mailing list. It has moved again, and is
|
||||||
|
now hosted by SuSE - thanks to Thorsten Kukuk <kukuk@suse.de>.
|
||||||
|
Send the command "subscribe shadow" to majordomo@suse.com to
|
||||||
|
subscribe if you are interested. To send mail to everyone on
|
||||||
|
the list, send it to shadow@suse.com.
|
||||||
|
|
||||||
|
Before reporting bugs, please check if they still exist in my latest
|
||||||
|
development snapshot. Every few weeks I make a new version available
|
||||||
|
at the following URLs:
|
||||||
|
ftp://piast.t19.ds.pwr.wroc.pl/pub/linux/shadow/
|
||||||
|
ftp://ftp.ists.pwr.wroc.pl/pub/linux/shadow/
|
||||||
|
http://www.itnet.pl/amelektr/linux/shadow/
|
||||||
|
(there are also mirror sites, see README.mirrors).
|
||||||
|
|
||||||
|
After installation, please remember to remove any old binaries like
|
||||||
|
/bin/passwd (this version installs /usr/bin/passwd). If your passwd
|
||||||
|
program doesn't like the new /etc/login.defs settings, and complains
|
||||||
|
about "configuration error", this is most likely the problem.
|
||||||
|
|
||||||
|
Current versions of the Linux C library (both libc 5.x and glibc 2.x)
|
||||||
|
have the shadow support, including MD5-based crypt(), built in.
|
||||||
|
Because of this, libshadow.a will build without these functions,
|
||||||
|
and the ones from libc will be used instead. Currently, libshadow.a
|
||||||
|
is for internal use only, so if you see -lshadow in a Makefile of
|
||||||
|
some other package, it is safe to remove it.
|
||||||
|
|
||||||
|
Remember that shadow passwords will not make your system more secure
|
||||||
|
if your distribution has gaping holes which let any user become root.
|
||||||
|
Some distributions, especially the older ones, are much like SunOS 4.1
|
||||||
|
without any security patches installed :-). Read the linux-security
|
||||||
|
mailing list archives, and plug all holes before attempting to install
|
||||||
|
the shadow suite.
|
||||||
|
|
||||||
|
Very old versions of this package (shadow-3.3.x, shadow-mk) had a few
|
||||||
|
nasty security holes, too. Please use the latest version if possible.
|
||||||
|
|
||||||
|
Encrypted passwords are not readable, but it is highly recommended
|
||||||
|
to use cracklib with a big dictionary to prevent users from choosing
|
||||||
|
weak passwords. This way if someone ever gets access to /etc/shadow
|
||||||
|
(for example, because of some not yet discovered bug), they will not
|
||||||
|
get half of the passwords using Crack... There is a configure option
|
||||||
|
to use cracklib, I haven't tested it myself but I'm told it works.
|
||||||
|
|
||||||
|
The code feels like stabilizing now - while still BETA, it should
|
||||||
|
work quite well. Many bugs have been fixed, but there may be still
|
||||||
|
a few lurking. Again, please test it and report any problems.
|
||||||
|
|
||||||
|
Thanks to Julianne Frances Haugh <jfh@bga.com> who wrote the thing
|
||||||
|
in the first place, sent me the latest version, and released it under
|
||||||
|
a "free" BSD-style license, so that it can be included in Linux
|
||||||
|
distributions (at least Debian 1.3 and Slackware 3.2 are already
|
||||||
|
doing that; Debian and Red Hat packaging standards are supported in
|
||||||
|
the standard source tree). David Frey <David.Frey@lugs.ch>, Michael
|
||||||
|
Meskes <meskes@topsystem.de> and Guy Maor <maor@debian.org> have
|
||||||
|
done a lot of work to integrate shadow passwords into Debian Linux.
|
||||||
|
|
||||||
|
Thanks to Bradley Glonka <bradley@123.net> of Linux System Labs
|
||||||
|
(http://www.lsl.com/) for sending me a free Red Hat 4.2 CD-ROM,
|
||||||
|
making it possible to test this package on this distribution.
|
||||||
|
|
||||||
|
Special thanks to Michael H. Jackson <mhjack@tscnet.com> who wrote
|
||||||
|
the Linux Shadow Password HOWTO. Special thanks to Greg Gallagher
|
||||||
|
<ggallag@orion.it.luc.edu> and Jon Lewis for maintaining the
|
||||||
|
developers mailing list for a long time.
|
||||||
|
|
||||||
|
Thanks to Maciej 'Tycoon' Majchrowski <tycoon@piast.t19.ds.pwr.wroc.pl>
|
||||||
|
for ftp server space on piast.t19.ds.pwr.wroc.pl, and to Pawel Wiecek
|
||||||
|
<coven@pwr.wroc.pl> for keeping bach.ists.pwr.wroc.pl up and running.
|
||||||
|
|
||||||
|
Ian Jackson <iwj10@cus.cam.ac.uk> criticized the current shadow password
|
||||||
|
system (see the linux-security mailing list archives). We disagree on
|
||||||
|
some points, but this started a discussion on possible better solutions.
|
||||||
|
Theodore Ts'o <tytso@mit.edu> has started a new project to implement
|
||||||
|
Pluggable Authentication Modules - a relatively new standard API which
|
||||||
|
makes it easier to add new authentication mechanisms (it's more than
|
||||||
|
just shadow passwords). See http://parc.power.net/morgan/Linux-PAM/ for
|
||||||
|
more information. (XXX - this URL has changed, I have to check where
|
||||||
|
PAM is now... -MM)
|
||||||
|
|
||||||
|
Thanks to at least the following people for sending me patches, bug
|
||||||
|
reports and various comments. This list may be incomplete, I received
|
||||||
|
a lot of mail...
|
||||||
|
|
||||||
|
John Adelsberger <jja@umr.edu>
|
||||||
|
Martin Bene <mb@sime.com>
|
||||||
|
Luca Berra <bluca@www.polimi.it>
|
||||||
|
Darcy Boese <possum@chardonnay.niagara.com>
|
||||||
|
Judd Bourgeois <shagboy@bluesky.net>
|
||||||
|
Ulisses Alonso Camaro <ulisses@pusa.eleinf.uv.es>
|
||||||
|
Ed Carp <ecarp@netcom.com>
|
||||||
|
Rani Chouha <ranibey@smartec.com>
|
||||||
|
Joshua Cowan <jcowan@hermit.reslife.okstate.edu>
|
||||||
|
Alan Curry <pacman@tardis.mars.net>
|
||||||
|
Frank Denis <j@4u.net>
|
||||||
|
Hrvoje Dogan <hdogan@bjesomar.srce.hr>
|
||||||
|
Chris Evans <lady0110@sable.ox.ac.uk>
|
||||||
|
Marc Ewing <marc@redhat.com>
|
||||||
|
Janos Farkas <chexum@bankinf.banki.hu>
|
||||||
|
Werner Fink <werner@suse.de>
|
||||||
|
Floody <flood@evcom.net>
|
||||||
|
David Frey <David.Frey@lugs.ch>
|
||||||
|
Brian R. Gaeke <brg@dgate.org>
|
||||||
|
Cristian Gafton <gafton@sorosis.ro>
|
||||||
|
Anton Gluck <gluc@midway.uchicago.edu>
|
||||||
|
Dave Hagewood <admin@arrowweb.com>
|
||||||
|
Jonathan Hankins <jhankins@mailserv.homewood.k12.al.us>
|
||||||
|
Juergen Heinzl <unicorn@noris.net>
|
||||||
|
Joey Hess <joey@kite.ml.org>
|
||||||
|
Tim Hockin <thockin@eagle.ais.net>
|
||||||
|
David A. Holland <dholland@hcs.harvard.edu>
|
||||||
|
Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||||
|
Timo Karjalainen <timok@iki.fi>
|
||||||
|
Calle Karlsson <ckn@kash.se>
|
||||||
|
Sami Kerola <kerolasa@rocketmail.com>
|
||||||
|
Thorsten Kukuk <kukuk@suse.de>
|
||||||
|
Jon Lewis <jlewis@lewis.org>
|
||||||
|
Pavel Machek <pavel@bug.ucw.cz>
|
||||||
|
Guy Maor <maor@debian.org>
|
||||||
|
Martin Mares <mj@gts.cz>
|
||||||
|
Rafal Maszkowski <rzm@torun.pdi.net>
|
||||||
|
Nikos Mavroyanopoulos <nmav@i-net.paiko.gr>
|
||||||
|
Michael Meskes <meskes@topsystem.de>
|
||||||
|
Arkadiusz Miskiewicz <misiek@pld.org.pl>
|
||||||
|
Greg Mortensen <loki@world.std.com>
|
||||||
|
Mike Pakovic <mpakovic@users.southeast.net>
|
||||||
|
Steve M. Robbins <steve@nyongwa.montreal.qc.ca>
|
||||||
|
Adam Rudnicki <adam@v-lo.krakow.pl>
|
||||||
|
Algis Rudys <arudys@rice.edu>
|
||||||
|
Lutz Schwalowsky <schwalow@mineralogie.uni-hamburg.de>
|
||||||
|
Jay Soffian <jay@lw.net>
|
||||||
|
Aniello Del Sorbo <anidel@edu-gw.dia.unisa.it>
|
||||||
|
Juha Virtanen <jiivee@iki.fi>
|
||||||
|
Michael Talbot-Wilson <mike@calypso.bns.com.au>
|
||||||
|
Jesse Thilo <Jesse.Thilo@pobox.com>
|
||||||
|
Shane Watts <shane@nexus.mlckew.edu.au>
|
||||||
|
Alexander O. Yuriev <alex@bach.cis.temple.edu>
|
||||||
|
Leonard N. Zubkoff <lnz@dandelion.com>
|
||||||
|
|
||||||
|
If you want to be added here, or your e-mail address changes,
|
||||||
|
please let me know. Thanks.
|
||||||
|
-- Marek Michalkiewicz <marekm@linux.org.pl>
|
||||||
57
doc/README.mirrors
Normal file
57
doc/README.mirrors
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
Primary sites for the Shadow Password Suite for Linux:
|
||||||
|
|
||||||
|
ftp://piast.t19.ds.pwr.wroc.pl/pub/linux/shadow/
|
||||||
|
ftp://ftp.ists.pwr.wroc.pl/pub/linux/shadow/
|
||||||
|
http://www.itnet.pl/amelektr/linux/shadow/
|
||||||
|
|
||||||
|
I upload latest versions here (and sometimes also to sunsite, but not
|
||||||
|
every new release). If you are not in Poland, these sites may be slow
|
||||||
|
for you - please use a mirror near you.
|
||||||
|
|
||||||
|
Thanks to several people who offered to mirror this archive. Mirror
|
||||||
|
sites known to me (with addresses of people who submitted them to
|
||||||
|
this list) are listed below. If you want your site to be added here,
|
||||||
|
please let me know (specify the URL, and contact e-mail address).
|
||||||
|
If any of these sites become way out of date and should be removed,
|
||||||
|
or if they are good but the URL changes, please let me know too.
|
||||||
|
|
||||||
|
Working mirrors that I know of, sorted by country (note: I removed
|
||||||
|
a few mirrors that didn't work when I tried to access them several
|
||||||
|
times - if any of them are still alive, please let me know):
|
||||||
|
|
||||||
|
Brazil:
|
||||||
|
|
||||||
|
ftp://ftp.athena.del.ufrj.br/pub/linux/shadow_password/
|
||||||
|
Rafael Jorge Csura Szendrodi <szendro@santuario.del.ufrj.br>
|
||||||
|
|
||||||
|
Czech Republic:
|
||||||
|
|
||||||
|
ftp://ftp.gts.cz/pub/linux/security/shadow/
|
||||||
|
Martin Mares <mj@mj.gts.cz>
|
||||||
|
|
||||||
|
Greece:
|
||||||
|
|
||||||
|
ftp://linux.forthnet.gr/pub/linux/shadow/
|
||||||
|
http://linux.forthnet.gr/pub/linux/shadow/
|
||||||
|
Sotiris Tsimbonis <stsimb@forthnet.gr>
|
||||||
|
|
||||||
|
Poland:
|
||||||
|
|
||||||
|
ftp://xenium.pdi.net/pub/Crypto/shadow/
|
||||||
|
Marcin E. Bednarz <specula@pdi.net>
|
||||||
|
|
||||||
|
ftp://giswitch.sggw.waw.pl/pub/Linux/shadow/
|
||||||
|
Marek Czajko <mcj@giswitch.sggw.waw.pl>
|
||||||
|
|
||||||
|
Romania:
|
||||||
|
|
||||||
|
ftp://ftp.kappa.ro/pub/Linux/Security/shadow/
|
||||||
|
Mircea Damian <dmircea@kappa.ro>
|
||||||
|
|
||||||
|
United States:
|
||||||
|
|
||||||
|
none?
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
Marek Michalkiewicz <marekm@linux.org.pl>
|
||||||
|
(or marekm@piast.t19.ds.pwr.wroc.pl, or marekm@bach.ists.pwr.wroc.pl)
|
||||||
30
doc/README.nls
Normal file
30
doc/README.nls
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
I've added in password suite 980724 nls and locale support (currently
|
||||||
|
only for greek). Before compiling (configuring) you must have set the
|
||||||
|
environment variable LINGUAS=el for greek or LINGUAS="" just for english.
|
||||||
|
To see your language at login (to the other programs export LANG=el is
|
||||||
|
enough) when you enter your login add LANG=xx, where xx is your language.
|
||||||
|
An other way to accomplish it is change the variable ENVIRON_FILE in
|
||||||
|
/etc/login.defs from /etc/environment to .environment. Thus any user
|
||||||
|
can add, to his .environment file, his language eg. LANG=el.
|
||||||
|
|
||||||
|
Nikos Mavroyanopoulos
|
||||||
|
nmav@i-net.paiko.gr
|
||||||
|
|
||||||
|
Note: i18n support as of this release (981218) can have some rough
|
||||||
|
edges - because of the large number of files updated, there is always
|
||||||
|
a possibility that I have introduced some new bugs. There are also
|
||||||
|
potential security problems in GNU gettext (both the included one and
|
||||||
|
one found in glibc 2.0.x) related to environment variables (LANG,
|
||||||
|
LANGUAGE, LC_*, NLSPATH) when used in setuid programs. I have tried
|
||||||
|
to work around them in sanitize_env() but no guarantees. The problem
|
||||||
|
has been reported to the gettext maintainer.
|
||||||
|
|
||||||
|
Also, you may not be able to legally distribute binaries compiled
|
||||||
|
with included gettext (GPL and BSD-like licenses are not compatible).
|
||||||
|
I believe that distribution in the same source archive is OK though
|
||||||
|
(it's a "mere aggregation of another work not based on the Program
|
||||||
|
with the Program" - here Program == gettext library - "on a volume of
|
||||||
|
a storage or distribution medium"). Please tell the FSF politely that
|
||||||
|
they should consider changing the gettext license to LGPL. Thanks!
|
||||||
|
|
||||||
|
Marek
|
||||||
36
doc/README.pam
Normal file
36
doc/README.pam
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
About PAM support in the Shadow Password Suite
|
||||||
|
|
||||||
|
Warning: this code is still considered ALPHA. It is still incomplete,
|
||||||
|
and needs more testing. Please let me know if it works, or if something
|
||||||
|
doesn't work.
|
||||||
|
|
||||||
|
Use "./configure --with-libpam" to enable PAM support. Right now it only
|
||||||
|
works for the passwd and su applications. PAM support still needs to be
|
||||||
|
implemented in login.
|
||||||
|
|
||||||
|
When compiled with PAM support enabled, the following traditional features
|
||||||
|
of the shadow suite are not implemented directly in the applications -
|
||||||
|
instead, they should be implemented in the PAM modules.
|
||||||
|
|
||||||
|
passwd:
|
||||||
|
- administrator defined authentication methods
|
||||||
|
- TCFS support
|
||||||
|
- password expiration
|
||||||
|
- password strength checks
|
||||||
|
|
||||||
|
su:
|
||||||
|
- wheel group
|
||||||
|
- console groups
|
||||||
|
- su access control (/etc/suauth)
|
||||||
|
- password expiration
|
||||||
|
- time restrictions
|
||||||
|
- resource limits
|
||||||
|
|
||||||
|
Known problems:
|
||||||
|
- the pam_limits module doesn't work with su - it should be changed
|
||||||
|
to set the limits in pam_setcred() instead of pam_open_session()
|
||||||
|
(this version of su doesn't open any new sessions, like Solaris su
|
||||||
|
and unlike SimplePAMApps su)
|
||||||
|
- PAM support still needs to be implemented in login
|
||||||
|
|
||||||
33
doc/README.platforms
Normal file
33
doc/README.platforms
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# $Id: README.platforms,v 1.4 1999/06/07 16:40:44 marekm Exp $
|
||||||
|
#
|
||||||
|
# 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>
|
||||||
25
doc/README.shadow-paper
Normal file
25
doc/README.shadow-paper
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
Date: Fri, 06 Jun 1997 22:57:27 -0500
|
||||||
|
From: Julie Haugh <jfh@tab.com>
|
||||||
|
To: marekm@piast.t19.ds.pwr.wroc.pl
|
||||||
|
CC: shadow-list@neptune.cin.net, debian-devel@lists.debian.org
|
||||||
|
Subject: Shadow Paper available from the web now.
|
||||||
|
|
||||||
|
Greets,
|
||||||
|
|
||||||
|
I've finally managed to key in my '92 security paper on Shadow. You can
|
||||||
|
find it at
|
||||||
|
|
||||||
|
http://www.tab.com/~jfh/shadow-paper.html
|
||||||
|
|
||||||
|
As I get some time to go over how things have changed in the last 5
|
||||||
|
years I intend to update it.
|
||||||
|
|
||||||
|
My next Shadow-related project is cleaning up the documentation I
|
||||||
|
started for the Trusted Subsystem evaluation I started a couple of
|
||||||
|
years ago. There are a few really worthwhile documents a system
|
||||||
|
administrator might enjoy in there.
|
||||||
|
--
|
||||||
|
Julianne Frances Haugh Feminism:
|
||||||
|
mailto:jfh@tab.com The belief (considered radical by
|
||||||
|
http://www.tab.com/~jfh some) that women are people, too.
|
||||||
|
|
||||||
39
doc/README.sun4
Normal file
39
doc/README.sun4
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
[ $Id: README.sun4,v 1.1.1.1 1996/08/10 07:59:52 marekm Exp $ ]
|
||||||
|
|
||||||
|
You'll need to do the following to get the shadow password dist to
|
||||||
|
compile on a sun 4.1.1 system.
|
||||||
|
|
||||||
|
copy Makefile.sun4 to Makefile, and make any system specific changes.
|
||||||
|
|
||||||
|
copy config.h.sun4 config.h, and make any system specific changes.
|
||||||
|
|
||||||
|
You may have to edit the pwd.h.m4 file by hand, as the sunos m4 may
|
||||||
|
not grok the pwd.h.m4 file corectly. If you have the /usr/5bin/m4,
|
||||||
|
substitute that. Be sure to delete the pwd.h file before typeing
|
||||||
|
'make' again, as there will be an empty one left from the failed attempt
|
||||||
|
to use the standard sunos m4.
|
||||||
|
|
||||||
|
type 'make'. If everything goes well, then type 'make install'
|
||||||
|
|
||||||
|
If using csh, then type 'rehash'. cd to the /etc directory and type
|
||||||
|
'pwconv'. This will create two files, nshadow and npasswd.
|
||||||
|
now type 'mkpasswd -f nshadow' and 'mkpasswd -f npasswd'. This will
|
||||||
|
create the shadow password file.
|
||||||
|
|
||||||
|
Note: The shadow group stuff does not work with sunos.
|
||||||
|
|
||||||
|
Note: ftp will still use the old password file.
|
||||||
|
|
||||||
|
Note: if you run suns pcnfs, be aware that it will still be looking at the
|
||||||
|
old password file as well. I may work out a patch for this, as I am
|
||||||
|
fairly certain the stuff on the sun side comes with source.
|
||||||
|
|
||||||
|
Note: I have compiled this package with the standard c compiler and
|
||||||
|
suns unbundled c compiler at an optomization level of 2 in
|
||||||
|
both casses. Haven't tried gcc yet, so I don't know wether it
|
||||||
|
works. Same goes for suns C++ compiler.
|
||||||
|
|
||||||
|
Note: has been compiled on a sun 3/75 running sunos 4.1.1. Should compile
|
||||||
|
fine on sun 4's running 4.1.1, and may compile on suns running
|
||||||
|
4.1. Have no idea what sort of success people will have that
|
||||||
|
are running 4.03 and older versions.
|
||||||
61
doc/WISHLIST
Normal file
61
doc/WISHLIST
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
$Id: WISHLIST,v 1.22 1999/07/09 18:02:43 marekm Exp $
|
||||||
|
|
||||||
|
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)
|
||||||
|
- update man pages to reflect all the changes (real programmers ... :-)
|
||||||
|
- patch for rlogind/telnetd to create utmp entry and fill in ut_addr
|
||||||
|
- fix the usermod -l bug properly [for now it's OK - #undef AUTH_METHODS]
|
||||||
|
- IMPORTANT: finish PAM support (passwd, su - done, untested; login - started)
|
||||||
|
- 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
|
||||||
|
- clean up NDBM support, do it in the library and not in all programs
|
||||||
|
- 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)
|
||||||
|
- better documentation
|
||||||
|
- su -l, -m, -p, -s options (as in GNU su)
|
||||||
|
- vipw: check password files for errors after editing
|
||||||
|
- clean up login utmp(x) handling code
|
||||||
|
- add "maximum time users allowed to stay logged in" limit option to logoutd
|
||||||
|
- "make" infinite loop on some systems? (Slackware 3.1, possibly others)
|
||||||
|
- handle quotes in /etc/environment like the shell does (but sshd doesn't...)
|
||||||
|
- write man pages: dialups.5, d_passwd.5
|
||||||
|
- better utmpx support (logoutd, ...)
|
||||||
|
- better OPIE support (check access file, prompt for one-time password
|
||||||
|
with echo on, report number of logins left, etc.)
|
||||||
|
- init sometimes fails to remove the utmp entry on logout, why?
|
||||||
|
(init 2.74 - can't reproduce with 2.71 on Debian 1.3, works fine)
|
||||||
|
- new option for /etc/suauth: don't load user's environment (force "su -")
|
||||||
|
suggested by Ulisses Alonso Camaro
|
||||||
|
- clean up error messages - "program_name: text of error message\n"
|
||||||
|
(maybe some common code for common messages about failing to lock/open
|
||||||
|
something)
|
||||||
|
- don't use putgrent() even if available (glibc-2.0.100 bug)
|
||||||
|
- find out why recent releases won't compile on Solaris
|
||||||
|
- change logoutd to simply cat the contents of /etc/logoutd.mesg to the
|
||||||
|
luser's tty (no need to reload with SIGHUP)
|
||||||
|
- make the new getpass() replacement optional configurable at run time
|
||||||
|
(some people don't like the asterisks)
|
||||||
|
- newusers UID/GID selection algorithm should be the same as useradd
|
||||||
|
(and use UID_MIN, UID_MAX from login.defs)
|
||||||
|
- newusers should be able to copy /etc/skel to the new home directory
|
||||||
|
(like useradd)
|
||||||
|
- change makefiles to work with the latest automake
|
||||||
|
- include i18n files in Debian packages
|
||||||
|
- integrate the latest upstream version into the Debian distribution
|
||||||
|
(they still have shadow-980403, many bugs have been fixed since then)
|
||||||
36
doc/console.c.spec.txt
Normal file
36
doc/console.c.spec.txt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
$Id: console.c.spec.txt,v 1.1 1997/06/16 00:02:41 marekm Exp $
|
||||||
|
|
||||||
|
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
|
||||||
340
doc/cracklib26.diff
Normal file
340
doc/cracklib26.diff
Normal file
@@ -0,0 +1,340 @@
|
|||||||
|
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 '^#' |
|
||||||
7
etc/Makefile.am
Normal file
7
etc/Makefile.am
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
EXTRA_DIST = limits login.access login.defs login.defs.linux \
|
||||||
|
shells suauth
|
||||||
|
|
||||||
|
SUBDIRS = pam.d
|
||||||
285
etc/Makefile.in
Normal file
285
etc/Makefile.in
Normal file
@@ -0,0 +1,285 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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.
|
||||||
|
|
||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
DISTDIR =
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = ..
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CATALOGS = @CATALOGS@
|
||||||
|
CATOBJEXT = @CATOBJEXT@
|
||||||
|
CC = @CC@
|
||||||
|
CPP = @CPP@
|
||||||
|
DATADIRNAME = @DATADIRNAME@
|
||||||
|
GENCAT = @GENCAT@
|
||||||
|
GMOFILES = @GMOFILES@
|
||||||
|
GMSGFMT = @GMSGFMT@
|
||||||
|
GT_NO = @GT_NO@
|
||||||
|
GT_YES = @GT_YES@
|
||||||
|
INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
|
||||||
|
INSTOBJEXT = @INSTOBJEXT@
|
||||||
|
INTLDEPS = @INTLDEPS@
|
||||||
|
INTLLIBS = @INTLLIBS@
|
||||||
|
INTLOBJS = @INTLOBJS@
|
||||||
|
LD = @LD@
|
||||||
|
LIBCRACK = @LIBCRACK@
|
||||||
|
LIBCRYPT = @LIBCRYPT@
|
||||||
|
LIBPAM = @LIBPAM@
|
||||||
|
LIBSKEY = @LIBSKEY@
|
||||||
|
LIBTCFS = @LIBTCFS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
|
MSGFMT = @MSGFMT@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
POFILES = @POFILES@
|
||||||
|
POSUB = @POSUB@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
U = @U@
|
||||||
|
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
||||||
|
USE_NLS = @USE_NLS@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
YACC = @YACC@
|
||||||
|
l = @l@
|
||||||
|
|
||||||
|
EXTRA_DIST = limits login.access login.defs login.defs.linux \
|
||||||
|
shells suauth
|
||||||
|
|
||||||
|
SUBDIRS = pam.d
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = ../config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
DIST_COMMON = Makefile.am Makefile.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
all: all-recursive all-am
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps etc/Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
|
||||||
|
# This directory's subdirectories are mostly independent; you can cd
|
||||||
|
# into them and run `make' without going through this Makefile.
|
||||||
|
# To change the values of `make' variables: instead of editing Makefiles,
|
||||||
|
# (1) if the variable is set in `config.status', edit `config.status'
|
||||||
|
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||||
|
# (2) otherwise, pass the desired values on the `make' command line.
|
||||||
|
|
||||||
|
@SET_MAKE@
|
||||||
|
|
||||||
|
all-recursive install-data-recursive install-exec-recursive \
|
||||||
|
installdirs-recursive install-recursive uninstall-recursive \
|
||||||
|
check-recursive installcheck-recursive info-recursive dvi-recursive:
|
||||||
|
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
(cd $$subdir && $(MAKE) $$target) \
|
||||||
|
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
|
||||||
|
mostlyclean-recursive clean-recursive distclean-recursive \
|
||||||
|
maintainer-clean-recursive:
|
||||||
|
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||||
|
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
rev="$$subdir $$rev"; \
|
||||||
|
done; \
|
||||||
|
for subdir in $$rev; do \
|
||||||
|
target=`echo $@ | sed s/-recursive//`; \
|
||||||
|
echo "Making $$target in $$subdir"; \
|
||||||
|
(cd $$subdir && $(MAKE) $$target) \
|
||||||
|
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||||
|
done && test -z "$$fail"
|
||||||
|
tags-recursive:
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
(cd $$subdir && $(MAKE) tags); \
|
||||||
|
done
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES) $(LISP)
|
||||||
|
here=`pwd` && cd $(srcdir) \
|
||||||
|
&& mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP)
|
||||||
|
|
||||||
|
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
|
||||||
|
tags=; \
|
||||||
|
here=`pwd`; \
|
||||||
|
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||||
|
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
|
||||||
|
done; \
|
||||||
|
list='$(SOURCES) $(HEADERS)'; \
|
||||||
|
unique=`for i in $$list; do echo $$i; done | \
|
||||||
|
awk ' { files[$$0] = 1; } \
|
||||||
|
END { for (i in files) print i; }'`; \
|
||||||
|
test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
|
||||||
|
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
|
||||||
|
|
||||||
|
mostlyclean-tags:
|
||||||
|
|
||||||
|
clean-tags:
|
||||||
|
|
||||||
|
distclean-tags:
|
||||||
|
-rm -f TAGS ID
|
||||||
|
|
||||||
|
maintainer-clean-tags:
|
||||||
|
|
||||||
|
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
|
||||||
|
subdir = etc
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
for subdir in $(SUBDIRS); do \
|
||||||
|
test -d $(distdir)/$$subdir \
|
||||||
|
|| mkdir $(distdir)/$$subdir \
|
||||||
|
|| exit 1; \
|
||||||
|
chmod 777 $(distdir)/$$subdir; \
|
||||||
|
(cd $$subdir && $(MAKE) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
|
||||||
|
|| exit 1; \
|
||||||
|
done
|
||||||
|
info: info-recursive
|
||||||
|
dvi: dvi-recursive
|
||||||
|
check: all-am
|
||||||
|
$(MAKE) check-recursive
|
||||||
|
installcheck: installcheck-recursive
|
||||||
|
all-am: Makefile
|
||||||
|
|
||||||
|
install-exec: install-exec-recursive
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data: install-data-recursive
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-recursive
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall: uninstall-recursive
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs: installdirs-recursive
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean-am: mostlyclean-tags mostlyclean-generic
|
||||||
|
|
||||||
|
clean-am: clean-tags clean-generic mostlyclean-am
|
||||||
|
|
||||||
|
distclean-am: distclean-tags distclean-generic clean-am
|
||||||
|
|
||||||
|
maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
|
||||||
|
distclean-am
|
||||||
|
|
||||||
|
mostlyclean: mostlyclean-recursive mostlyclean-am
|
||||||
|
|
||||||
|
clean: clean-recursive clean-am
|
||||||
|
|
||||||
|
distclean: distclean-recursive distclean-am
|
||||||
|
-rm -f config.status
|
||||||
|
-rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
.PHONY: install-data-recursive uninstall-data-recursive \
|
||||||
|
install-exec-recursive uninstall-exec-recursive installdirs-recursive \
|
||||||
|
uninstalldirs-recursive all-recursive check-recursive \
|
||||||
|
installcheck-recursive info-recursive dvi-recursive \
|
||||||
|
mostlyclean-recursive distclean-recursive clean-recursive \
|
||||||
|
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
|
||||||
|
distclean-tags clean-tags maintainer-clean-tags distdir info dvi \
|
||||||
|
installcheck all-am install-exec install-data install uninstall all \
|
||||||
|
installdirs mostlyclean-generic distclean-generic clean-generic \
|
||||||
|
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
28
etc/limits
Normal file
28
etc/limits
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# /etc/limits contains user resource limits.
|
||||||
|
# See limits(5).
|
||||||
|
#
|
||||||
|
# Format:
|
||||||
|
# <username> <limits-string>
|
||||||
|
#
|
||||||
|
# default entry is '*' for username
|
||||||
|
#
|
||||||
|
# Valid flags are:
|
||||||
|
# A: max address space (KB)
|
||||||
|
# C: max core file size (KB)
|
||||||
|
# D: max data size (KB)
|
||||||
|
# F: maximum filesize (KB)
|
||||||
|
# M: max locked-in-memory address space (KB) [only for root on Linux 2.0.x]
|
||||||
|
# N: max number of open files
|
||||||
|
# R: max resident set size (KB) [no effect on Linux 2.0.x]
|
||||||
|
# S: max stack size (KB)
|
||||||
|
# T: max CPU time (MIN)
|
||||||
|
# U: max number of processes
|
||||||
|
# L: max number of logins for this user
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# the default entry
|
||||||
|
#* L2 D6144 R2048 S2048 U32 N32 F16384 T5 C0
|
||||||
|
# another way of suspending a user login
|
||||||
|
#guest L0
|
||||||
|
# this account has no limits
|
||||||
|
#sysadm -
|
||||||
54
etc/login.access
Normal file
54
etc/login.access
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# $Id: login.access,v 1.2 1996/09/10 02:45:04 marekm Exp $
|
||||||
|
#
|
||||||
|
# Login access control table.
|
||||||
|
#
|
||||||
|
# When someone logs in, the table is scanned for the first entry that
|
||||||
|
# matches the (user, host) combination, or, in case of non-networked
|
||||||
|
# logins, the first entry that matches the (user, tty) combination. The
|
||||||
|
# permissions field of that table entry determines whether the login will
|
||||||
|
# be accepted or refused.
|
||||||
|
#
|
||||||
|
# Format of the login access control table is three fields separated by a
|
||||||
|
# ":" character:
|
||||||
|
#
|
||||||
|
# permission : users : origins
|
||||||
|
#
|
||||||
|
# The first field should be a "+" (access granted) or "-" (access denied)
|
||||||
|
# character.
|
||||||
|
#
|
||||||
|
# The second field should be a list of one or more login names, group
|
||||||
|
# names, or ALL (always matches). A pattern of the form user@host is
|
||||||
|
# matched when the login name matches the "user" part, and when the
|
||||||
|
# "host" part matches the local machine name.
|
||||||
|
#
|
||||||
|
# The third field should be a list of one or more tty names (for
|
||||||
|
# non-networked logins), host names, domain names (begin with "."), host
|
||||||
|
# addresses, internet network numbers (end with "."), ALL (always
|
||||||
|
# matches) or LOCAL (matches any string that does not contain a "."
|
||||||
|
# character).
|
||||||
|
#
|
||||||
|
# If you run NIS you can use @netgroupname in host or user patterns; this
|
||||||
|
# even works for @usergroup@@hostgroup patterns. Weird.
|
||||||
|
#
|
||||||
|
# The EXCEPT operator makes it possible to write very compact rules.
|
||||||
|
#
|
||||||
|
# The group file is searched only when a name does not match that of the
|
||||||
|
# logged-in user. Only groups are matched in which users are explicitly
|
||||||
|
# listed: the program does not look at a user's primary group id value.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Disallow console logins to all but a few accounts.
|
||||||
|
#
|
||||||
|
#-:ALL EXCEPT wheel shutdown sync:console
|
||||||
|
#
|
||||||
|
# Disallow non-local logins to privileged accounts (group wheel).
|
||||||
|
#
|
||||||
|
#-:wheel:ALL EXCEPT LOCAL .win.tue.nl
|
||||||
|
#
|
||||||
|
# Some accounts are not allowed to login from anywhere:
|
||||||
|
#
|
||||||
|
#-:wsbscaro wsbsecr wsbspac wsbsym wscosor wstaiwde:ALL
|
||||||
|
#
|
||||||
|
# All other accounts are allowed to login from anywhere.
|
||||||
|
#
|
||||||
214
etc/login.defs
Normal file
214
etc/login.defs
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
#
|
||||||
|
# /etc/login.defs - Configuration control definitions for the login package.
|
||||||
|
#
|
||||||
|
# $Id: login.defs,v 1.2 1997/05/01 23:14:35 marekm Exp $
|
||||||
|
#
|
||||||
|
# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH.
|
||||||
|
# If unspecified, some arbitrary (and possibly incorrect) value will
|
||||||
|
# be assumed. All other items are optional - if not specified then
|
||||||
|
# the described action or option will be inhibited.
|
||||||
|
#
|
||||||
|
# Comment lines (lines beginning with "#") and blank lines are ignored.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Delay in seconds before being allowed another attempt after a login failure
|
||||||
|
#
|
||||||
|
FAIL_DELAY 5
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable additional passwords upon dialup lines specified in /etc/dialups.
|
||||||
|
#
|
||||||
|
DIALUPS_CHECK_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable logging and display of /usr/adm/faillog login failure info.
|
||||||
|
#
|
||||||
|
FAILLOG_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable display of unknown usernames when login failures are recorded.
|
||||||
|
#
|
||||||
|
LOG_UNKFAIL_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable logging and display of /usr/adm/lastlog login time info.
|
||||||
|
#
|
||||||
|
LASTLOG_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable checking and display of mailbox status upon login.
|
||||||
|
#
|
||||||
|
MAIL_CHECK_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable additional checks upon password changes.
|
||||||
|
#
|
||||||
|
OBSCURE_CHECKS_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable checking of time restrictions specified in /etc/porttime.
|
||||||
|
#
|
||||||
|
PORTTIME_CHECKS_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable setting of ulimit, umask, and niceness from passwd gecos field.
|
||||||
|
#
|
||||||
|
QUOTAS_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable "syslog" logging of su activity - in addition to sulog file logging.
|
||||||
|
# SYSLOG_SG_ENAB does the same for newgrp and sg.
|
||||||
|
#
|
||||||
|
SYSLOG_SU_ENAB no
|
||||||
|
SYSLOG_SG_ENAB no
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, either full pathname of a file containing device names or
|
||||||
|
# a ":" delimited list of device names. Root logins will be allowed only
|
||||||
|
# upon these devices.
|
||||||
|
#
|
||||||
|
CONSOLE /etc/consoles
|
||||||
|
#CONSOLE console:tty01:tty02:tty03:tty04
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, all su activity is logged to this file.
|
||||||
|
#
|
||||||
|
SULOG_FILE /usr/adm/sulog
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, ":" delimited list of "message of the day" files to
|
||||||
|
# be displayed upon login.
|
||||||
|
#
|
||||||
|
MOTD_FILE /etc/motd
|
||||||
|
#MOTD_FILE /etc/motd:/usr/lib/news/news-motd
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, this file will be output before each login prompt.
|
||||||
|
#
|
||||||
|
#ISSUE_FILE /etc/issue
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, file which maps tty line to TERM environment parameter.
|
||||||
|
# Each line of the file is in a format something like "vt100 tty01".
|
||||||
|
#
|
||||||
|
TTYTYPE_FILE /etc/ttytype
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, login failures will be logged here in a utmp format.
|
||||||
|
#
|
||||||
|
FTMP_FILE /etc/ftmp
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, name of file whose presence which will inhibit non-root
|
||||||
|
# logins. The contents of this file should be a message indicating
|
||||||
|
# why logins are inhibited.
|
||||||
|
#
|
||||||
|
NOLOGINS_FILE /etc/nologins
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, the command name to display when running "su -". For
|
||||||
|
# example, if this is defined as "su" then a "ps" will display the
|
||||||
|
# command is "-su". If not defined, then "ps" would display the
|
||||||
|
# name of the shell actually being run, e.g. something like "-sh".
|
||||||
|
#
|
||||||
|
SU_NAME su
|
||||||
|
|
||||||
|
#
|
||||||
|
# *REQUIRED*
|
||||||
|
# Directory where mailboxes reside, _or_ name of file, relative to the
|
||||||
|
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
|
||||||
|
# MAILDIR is for Qmail
|
||||||
|
#
|
||||||
|
#MAILDIR Maildir
|
||||||
|
MAIL_DIR /usr/spool/mail
|
||||||
|
#MAIL_FILE .mail
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, file which inhibits all the usual chatter during the login
|
||||||
|
# sequence. If a full pathname, then hushed mode will be enabled if the
|
||||||
|
# user's name or shell are found in the file. If not a full pathname, then
|
||||||
|
# hushed mode will be enabled if the file exists in the user's home directory.
|
||||||
|
#
|
||||||
|
#HUSHLOGIN_FILE .hushlogin
|
||||||
|
HUSHLOGIN_FILE /etc/hushlogins
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, the presence of this value in an /etc/passwd "shell" field will
|
||||||
|
# disable logins for that user, although "su" will still be allowed.
|
||||||
|
#
|
||||||
|
NOLOGIN_STR NOLOGIN
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, either a TZ environment parameter spec or the
|
||||||
|
# fully-rooted pathname of a file containing such a spec.
|
||||||
|
#
|
||||||
|
ENV_TZ TZ=CST6CDT
|
||||||
|
#ENV_TZ /etc/tzname
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, an HZ environment parameter spec.
|
||||||
|
#
|
||||||
|
ENV_HZ HZ=50
|
||||||
|
|
||||||
|
#
|
||||||
|
# *REQUIRED* The default PATH settings, for superuser and normal users.
|
||||||
|
#
|
||||||
|
ENV_SUPATH PATH=/etc/local:/etc:/local/bin:/usr/bin:/bin
|
||||||
|
ENV_PATH PATH=/local/bin:/usr/bin:/bin
|
||||||
|
|
||||||
|
#
|
||||||
|
# Terminal permissions
|
||||||
|
#
|
||||||
|
# TTYGROUP Login tty will be assigned this group ownership.
|
||||||
|
# TTYPERM Login tty will be set to this permission.
|
||||||
|
#
|
||||||
|
# If you have a "write" program which is "setgid" to a special group
|
||||||
|
# which owns the terminals, define TTYGROUP to the group number and
|
||||||
|
# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign
|
||||||
|
# TTYPERM to either 622 or 600.
|
||||||
|
#
|
||||||
|
#TTYGROUP 7
|
||||||
|
#TTYPERM 0620
|
||||||
|
TTYPERM 0622
|
||||||
|
|
||||||
|
#
|
||||||
|
# Login configuration initializations:
|
||||||
|
#
|
||||||
|
# ERASECHAR Terminal ERASE character ('\010' = backspace).
|
||||||
|
# KILLCHAR Terminal KILL character ('\025' = CTRL/U).
|
||||||
|
# UMASK Default "umask" value.
|
||||||
|
# ULIMIT Default "ulimit" value.
|
||||||
|
#
|
||||||
|
# The ERASECHAR and KILLCHAR are used only on System V machines.
|
||||||
|
# The ULIMIT is used only if the system supports it.
|
||||||
|
#
|
||||||
|
# Prefix these values with "0" to get octal, "0x" to get hexadecimal.
|
||||||
|
#
|
||||||
|
ERASECHAR 010
|
||||||
|
KILLCHAR 025
|
||||||
|
UMASK 022
|
||||||
|
ULIMIT 2097152
|
||||||
|
|
||||||
|
#
|
||||||
|
# Password aging controls:
|
||||||
|
#
|
||||||
|
# PASS_MAX_DAYS Maximum number of days a password may be used.
|
||||||
|
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
|
||||||
|
# PASS_MIN_LEN Minimum acceptable password length.
|
||||||
|
# PASS_WARN_AGE Number of days warning given before a password expires.
|
||||||
|
#
|
||||||
|
PASS_MAX_DAYS 99999
|
||||||
|
PASS_MIN_DAYS 0
|
||||||
|
PASS_MIN_LEN 5
|
||||||
|
PASS_WARN_AGE 7
|
||||||
|
|
||||||
|
#
|
||||||
|
# Only allow group 0 members to "su" to root.
|
||||||
|
#
|
||||||
|
SU_WHEEL_ONLY no
|
||||||
|
|
||||||
|
#
|
||||||
|
# If compiled with cracklib support, where are the dictionaries
|
||||||
|
#
|
||||||
|
#CRACKLIB_DICTPATH /usr/share/lib/pw_dict
|
||||||
340
etc/login.defs.linux
Normal file
340
etc/login.defs.linux
Normal file
@@ -0,0 +1,340 @@
|
|||||||
|
#
|
||||||
|
# /etc/login.defs - Configuration control definitions for the login package.
|
||||||
|
#
|
||||||
|
# $Id: login.defs.linux,v 1.10 1999/03/07 19:14:33 marekm Exp $
|
||||||
|
#
|
||||||
|
# Three items must be defined: MAIL_DIR, ENV_SUPATH, and ENV_PATH.
|
||||||
|
# If unspecified, some arbitrary (and possibly incorrect) value will
|
||||||
|
# be assumed. All other items are optional - if not specified then
|
||||||
|
# the described action or option will be inhibited.
|
||||||
|
#
|
||||||
|
# Comment lines (lines beginning with "#") and blank lines are ignored.
|
||||||
|
#
|
||||||
|
# Modified for Linux. --marekm
|
||||||
|
|
||||||
|
#
|
||||||
|
# Delay in seconds before being allowed another attempt after a login failure
|
||||||
|
#
|
||||||
|
FAIL_DELAY 3
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable additional passwords upon dialup lines specified in /etc/dialups.
|
||||||
|
#
|
||||||
|
DIALUPS_CHECK_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable logging and display of /var/log/faillog login failure info.
|
||||||
|
#
|
||||||
|
FAILLOG_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable display of unknown usernames when login failures are recorded.
|
||||||
|
#
|
||||||
|
LOG_UNKFAIL_ENAB no
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable logging of successful logins
|
||||||
|
#
|
||||||
|
LOG_OK_LOGINS no
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable logging and display of /var/log/lastlog login time info.
|
||||||
|
#
|
||||||
|
LASTLOG_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable checking and display of mailbox status upon login.
|
||||||
|
#
|
||||||
|
# Disable if the shell startup files already check for mail
|
||||||
|
# ("mailx -e" or equivalent).
|
||||||
|
#
|
||||||
|
MAIL_CHECK_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable additional checks upon password changes.
|
||||||
|
#
|
||||||
|
OBSCURE_CHECKS_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable checking of time restrictions specified in /etc/porttime.
|
||||||
|
#
|
||||||
|
PORTTIME_CHECKS_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable setting of ulimit, umask, and niceness from passwd gecos field.
|
||||||
|
#
|
||||||
|
QUOTAS_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable "syslog" logging of su activity - in addition to sulog file logging.
|
||||||
|
# SYSLOG_SG_ENAB does the same for newgrp and sg.
|
||||||
|
#
|
||||||
|
SYSLOG_SU_ENAB yes
|
||||||
|
SYSLOG_SG_ENAB yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, either full pathname of a file containing device names or
|
||||||
|
# a ":" delimited list of device names. Root logins will be allowed only
|
||||||
|
# upon these devices.
|
||||||
|
#
|
||||||
|
CONSOLE /etc/securetty
|
||||||
|
#CONSOLE console:tty01:tty02:tty03:tty04
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, all su activity is logged to this file.
|
||||||
|
#
|
||||||
|
#SULOG_FILE /var/log/sulog
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, ":" delimited list of "message of the day" files to
|
||||||
|
# be displayed upon login.
|
||||||
|
#
|
||||||
|
MOTD_FILE /etc/motd
|
||||||
|
#MOTD_FILE /etc/motd:/usr/lib/news/news-motd
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, this file will be output before each login prompt.
|
||||||
|
#
|
||||||
|
#ISSUE_FILE /etc/issue
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, file which maps tty line to TERM environment parameter.
|
||||||
|
# Each line of the file is in a format something like "vt100 tty01".
|
||||||
|
#
|
||||||
|
#TTYTYPE_FILE /etc/ttytype
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, login failures will be logged here in a utmp format.
|
||||||
|
# last, when invoked as lastb, will read /var/log/btmp, so...
|
||||||
|
#
|
||||||
|
FTMP_FILE /var/log/btmp
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, name of file whose presence which will inhibit non-root
|
||||||
|
# logins. The contents of this file should be a message indicating
|
||||||
|
# why logins are inhibited.
|
||||||
|
#
|
||||||
|
NOLOGINS_FILE /etc/nologin
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, the command name to display when running "su -". For
|
||||||
|
# example, if this is defined as "su" then a "ps" will display the
|
||||||
|
# command is "-su". If not defined, then "ps" would display the
|
||||||
|
# name of the shell actually being run, e.g. something like "-sh".
|
||||||
|
#
|
||||||
|
SU_NAME su
|
||||||
|
|
||||||
|
#
|
||||||
|
# *REQUIRED*
|
||||||
|
# Directory where mailboxes reside, _or_ name of file, relative to the
|
||||||
|
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
|
||||||
|
# QMAIL_DIR is for Qmail
|
||||||
|
#
|
||||||
|
#QMAIL_DIR Maildir
|
||||||
|
MAIL_DIR /var/spool/mail
|
||||||
|
#MAIL_FILE .mail
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, file which inhibits all the usual chatter during the login
|
||||||
|
# sequence. If a full pathname, then hushed mode will be enabled if the
|
||||||
|
# user's name or shell are found in the file. If not a full pathname, then
|
||||||
|
# hushed mode will be enabled if the file exists in the user's home directory.
|
||||||
|
#
|
||||||
|
HUSHLOGIN_FILE .hushlogin
|
||||||
|
#HUSHLOGIN_FILE /etc/hushlogins
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, the presence of this value in an /etc/passwd "shell" field will
|
||||||
|
# disable logins for that user, although "su" will still be allowed.
|
||||||
|
#
|
||||||
|
# XXX this does not seem to be implemented yet... --marekm
|
||||||
|
# no, it was implemented but I ripped it out ;-) -- jfh
|
||||||
|
NOLOGIN_STR NOLOGIN
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, either a TZ environment parameter spec or the
|
||||||
|
# fully-rooted pathname of a file containing such a spec.
|
||||||
|
#
|
||||||
|
#ENV_TZ TZ=CST6CDT
|
||||||
|
#ENV_TZ /etc/tzname
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, an HZ environment parameter spec.
|
||||||
|
#
|
||||||
|
# for Linux/x86
|
||||||
|
ENV_HZ HZ=100
|
||||||
|
# For Linux/Alpha...
|
||||||
|
#ENV_HZ HZ=1024
|
||||||
|
|
||||||
|
#
|
||||||
|
# *REQUIRED* The default PATH settings, for superuser and normal users.
|
||||||
|
#
|
||||||
|
# (they are minimal, add the rest in the shell startup files)
|
||||||
|
ENV_SUPATH PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||||
|
ENV_PATH PATH=/bin:/usr/bin
|
||||||
|
|
||||||
|
#
|
||||||
|
# Terminal permissions
|
||||||
|
#
|
||||||
|
# TTYGROUP Login tty will be assigned this group ownership.
|
||||||
|
# TTYPERM Login tty will be set to this permission.
|
||||||
|
#
|
||||||
|
# If you have a "write" program which is "setgid" to a special group
|
||||||
|
# which owns the terminals, define TTYGROUP to the group number and
|
||||||
|
# TTYPERM to 0620. Otherwise leave TTYGROUP commented out and assign
|
||||||
|
# TTYPERM to either 622 or 600.
|
||||||
|
#
|
||||||
|
TTYGROUP tty
|
||||||
|
TTYPERM 0600
|
||||||
|
|
||||||
|
#
|
||||||
|
# Login configuration initializations:
|
||||||
|
#
|
||||||
|
# ERASECHAR Terminal ERASE character ('\010' = backspace).
|
||||||
|
# KILLCHAR Terminal KILL character ('\025' = CTRL/U).
|
||||||
|
# UMASK Default "umask" value.
|
||||||
|
# ULIMIT Default "ulimit" value.
|
||||||
|
#
|
||||||
|
# The ERASECHAR and KILLCHAR are used only on System V machines.
|
||||||
|
# The ULIMIT is used only if the system supports it.
|
||||||
|
# (now it works with setrlimit too; ulimit is in 512-byte units)
|
||||||
|
#
|
||||||
|
# Prefix these values with "0" to get octal, "0x" to get hexadecimal.
|
||||||
|
#
|
||||||
|
ERASECHAR 0177
|
||||||
|
KILLCHAR 025
|
||||||
|
UMASK 022
|
||||||
|
#ULIMIT 2097152
|
||||||
|
|
||||||
|
#
|
||||||
|
# Password aging controls:
|
||||||
|
#
|
||||||
|
# PASS_MAX_DAYS Maximum number of days a password may be used.
|
||||||
|
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
|
||||||
|
# PASS_MIN_LEN Minimum acceptable password length.
|
||||||
|
# PASS_WARN_AGE Number of days warning given before a password expires.
|
||||||
|
#
|
||||||
|
PASS_MAX_DAYS 99999
|
||||||
|
PASS_MIN_DAYS 0
|
||||||
|
PASS_MIN_LEN 5
|
||||||
|
PASS_WARN_AGE 7
|
||||||
|
|
||||||
|
#
|
||||||
|
# If "yes", the user must be listed as a member of the first gid 0 group
|
||||||
|
# in /etc/group (called "root" on most Linux systems) to be able to "su"
|
||||||
|
# to uid 0 accounts. If the group doesn't exist or is empty, no one
|
||||||
|
# will be able to "su" to uid 0.
|
||||||
|
#
|
||||||
|
SU_WHEEL_ONLY no
|
||||||
|
|
||||||
|
#
|
||||||
|
# If compiled with cracklib support, where are the dictionaries
|
||||||
|
#
|
||||||
|
CRACKLIB_DICTPATH /var/cache/cracklib/cracklib_dict
|
||||||
|
|
||||||
|
#
|
||||||
|
# Min/max values for automatic uid selection in useradd
|
||||||
|
#
|
||||||
|
UID_MIN 1000
|
||||||
|
UID_MAX 60000
|
||||||
|
|
||||||
|
#
|
||||||
|
# Min/max values for automatic gid selection in groupadd
|
||||||
|
#
|
||||||
|
GID_MIN 100
|
||||||
|
GID_MAX 60000
|
||||||
|
|
||||||
|
#
|
||||||
|
# Max number of login retries if password is bad
|
||||||
|
#
|
||||||
|
LOGIN_RETRIES 5
|
||||||
|
|
||||||
|
#
|
||||||
|
# Max time in seconds for login
|
||||||
|
#
|
||||||
|
LOGIN_TIMEOUT 60
|
||||||
|
|
||||||
|
#
|
||||||
|
# Maximum number of attempts to change password if rejected (too easy)
|
||||||
|
#
|
||||||
|
PASS_CHANGE_TRIES 5
|
||||||
|
|
||||||
|
#
|
||||||
|
# Warn about weak passwords (but still allow them) if you are root.
|
||||||
|
#
|
||||||
|
PASS_ALWAYS_WARN yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Number of significant characters in the password for crypt().
|
||||||
|
# Default is 8, don't change unless your crypt() is better.
|
||||||
|
# Ignored if MD5_CRYPT_ENAB set to "yes".
|
||||||
|
#
|
||||||
|
#PASS_MAX_LEN 8
|
||||||
|
|
||||||
|
#
|
||||||
|
# Require password before chfn/chsh can make any changes.
|
||||||
|
#
|
||||||
|
CHFN_AUTH yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# Which fields may be changed by regular users using chfn - use
|
||||||
|
# any combination of letters "frwh" (full name, room number, work
|
||||||
|
# phone, home phone). If not defined, no changes are allowed.
|
||||||
|
# For backward compatibility, "yes" = "rwh" and "no" = "frwh".
|
||||||
|
#
|
||||||
|
CHFN_RESTRICT rwh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Password prompt (%s will be replaced by user name).
|
||||||
|
#
|
||||||
|
# XXX - it doesn't work correctly yet, for now leave it commented out
|
||||||
|
# to use the default which is just "Password: ".
|
||||||
|
#LOGIN_STRING "%s's Password: "
|
||||||
|
|
||||||
|
#
|
||||||
|
# Only works if compiled with MD5_CRYPT defined:
|
||||||
|
# If set to "yes", new passwords will be encrypted using the MD5-based
|
||||||
|
# algorithm compatible with the one used by recent releases of FreeBSD.
|
||||||
|
# It supports passwords of unlimited length and longer salt strings.
|
||||||
|
# Set to "no" if you need to copy encrypted passwords to other systems
|
||||||
|
# which don't understand the new algorithm. Default is "no".
|
||||||
|
#
|
||||||
|
#MD5_CRYPT_ENAB no
|
||||||
|
|
||||||
|
#
|
||||||
|
# List of groups to add to the user's supplementary group set
|
||||||
|
# when logging in on the console (as determined by the CONSOLE
|
||||||
|
# setting). Default is none.
|
||||||
|
#
|
||||||
|
# Use with caution - it is possible for users to gain permanent
|
||||||
|
# access to these groups, even when not logged in on the console.
|
||||||
|
# How to do it is left as an exercise for the reader...
|
||||||
|
#
|
||||||
|
#CONSOLE_GROUPS floppy:audio:cdrom
|
||||||
|
|
||||||
|
#
|
||||||
|
# Should login be allowed if we can't cd to the home directory?
|
||||||
|
# Default in no.
|
||||||
|
#
|
||||||
|
DEFAULT_HOME yes
|
||||||
|
|
||||||
|
#
|
||||||
|
# If this file exists and is readable, login environment will be
|
||||||
|
# read from it. Every line should be in the form name=value.
|
||||||
|
#
|
||||||
|
ENVIRON_FILE /etc/environment
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, this command is run when removing a user.
|
||||||
|
# It should remove any at/cron/print jobs etc. owned by
|
||||||
|
# the user to be removed (passed as the first argument).
|
||||||
|
#
|
||||||
|
#USERDEL_CMD /usr/sbin/userdel_local
|
||||||
|
|
||||||
|
#
|
||||||
|
# If defined, either full pathname of a file containing device names or
|
||||||
|
# a ":" delimited list of device names. No password is required to log in
|
||||||
|
# on these devices.
|
||||||
|
#
|
||||||
|
#NO_PASSWORD_CONSOLE tty1:tty2:tty3:tty4:tty5:tty6
|
||||||
|
|
||||||
4
etc/pam.d/Makefile.am
Normal file
4
etc/pam.d/Makefile.am
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
EXTRA_DIST = passwd su
|
||||||
195
etc/pam.d/Makefile.in
Normal file
195
etc/pam.d/Makefile.in
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||||
|
|
||||||
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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.
|
||||||
|
|
||||||
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
|
||||||
|
bindir = @bindir@
|
||||||
|
sbindir = @sbindir@
|
||||||
|
libexecdir = @libexecdir@
|
||||||
|
datadir = @datadir@
|
||||||
|
sysconfdir = @sysconfdir@
|
||||||
|
sharedstatedir = @sharedstatedir@
|
||||||
|
localstatedir = @localstatedir@
|
||||||
|
libdir = @libdir@
|
||||||
|
infodir = @infodir@
|
||||||
|
mandir = @mandir@
|
||||||
|
includedir = @includedir@
|
||||||
|
oldincludedir = /usr/include
|
||||||
|
|
||||||
|
DISTDIR =
|
||||||
|
|
||||||
|
pkgdatadir = $(datadir)/@PACKAGE@
|
||||||
|
pkglibdir = $(libdir)/@PACKAGE@
|
||||||
|
pkgincludedir = $(includedir)/@PACKAGE@
|
||||||
|
|
||||||
|
top_builddir = ../..
|
||||||
|
|
||||||
|
ACLOCAL = @ACLOCAL@
|
||||||
|
AUTOCONF = @AUTOCONF@
|
||||||
|
AUTOMAKE = @AUTOMAKE@
|
||||||
|
AUTOHEADER = @AUTOHEADER@
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
|
||||||
|
NORMAL_INSTALL = :
|
||||||
|
PRE_INSTALL = :
|
||||||
|
POST_INSTALL = :
|
||||||
|
NORMAL_UNINSTALL = :
|
||||||
|
PRE_UNINSTALL = :
|
||||||
|
POST_UNINSTALL = :
|
||||||
|
host_alias = @host_alias@
|
||||||
|
host_triplet = @host@
|
||||||
|
CATALOGS = @CATALOGS@
|
||||||
|
CATOBJEXT = @CATOBJEXT@
|
||||||
|
CC = @CC@
|
||||||
|
CPP = @CPP@
|
||||||
|
DATADIRNAME = @DATADIRNAME@
|
||||||
|
GENCAT = @GENCAT@
|
||||||
|
GMOFILES = @GMOFILES@
|
||||||
|
GMSGFMT = @GMSGFMT@
|
||||||
|
GT_NO = @GT_NO@
|
||||||
|
GT_YES = @GT_YES@
|
||||||
|
INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
|
||||||
|
INSTOBJEXT = @INSTOBJEXT@
|
||||||
|
INTLDEPS = @INTLDEPS@
|
||||||
|
INTLLIBS = @INTLLIBS@
|
||||||
|
INTLOBJS = @INTLOBJS@
|
||||||
|
LD = @LD@
|
||||||
|
LIBCRACK = @LIBCRACK@
|
||||||
|
LIBCRYPT = @LIBCRYPT@
|
||||||
|
LIBPAM = @LIBPAM@
|
||||||
|
LIBSKEY = @LIBSKEY@
|
||||||
|
LIBTCFS = @LIBTCFS@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
LN_S = @LN_S@
|
||||||
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
MAKEINFO = @MAKEINFO@
|
||||||
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
|
MSGFMT = @MSGFMT@
|
||||||
|
NM = @NM@
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
POFILES = @POFILES@
|
||||||
|
POSUB = @POSUB@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
U = @U@
|
||||||
|
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
||||||
|
USE_NLS = @USE_NLS@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
YACC = @YACC@
|
||||||
|
l = @l@
|
||||||
|
|
||||||
|
EXTRA_DIST = passwd su
|
||||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||||
|
CONFIG_HEADER = ../../config.h
|
||||||
|
CONFIG_CLEAN_FILES =
|
||||||
|
DIST_COMMON = Makefile.am Makefile.in
|
||||||
|
|
||||||
|
|
||||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
|
|
||||||
|
TAR = tar
|
||||||
|
GZIP = --best
|
||||||
|
all: Makefile
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||||
|
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps etc/pam.d/Makefile
|
||||||
|
|
||||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
|
cd $(top_builddir) \
|
||||||
|
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
TAGS:
|
||||||
|
|
||||||
|
|
||||||
|
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
|
||||||
|
subdir = etc/pam.d
|
||||||
|
|
||||||
|
distdir: $(DISTFILES)
|
||||||
|
@for file in $(DISTFILES); do \
|
||||||
|
d=$(srcdir); \
|
||||||
|
test -f $(distdir)/$$file \
|
||||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||||
|
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||||
|
done
|
||||||
|
info:
|
||||||
|
dvi:
|
||||||
|
check: all
|
||||||
|
$(MAKE)
|
||||||
|
installcheck:
|
||||||
|
install-exec:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install-data:
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
|
||||||
|
install: install-exec install-data all
|
||||||
|
@:
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
|
||||||
|
install-strip:
|
||||||
|
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||||
|
installdirs:
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean-generic:
|
||||||
|
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||||
|
|
||||||
|
clean-generic:
|
||||||
|
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||||
|
|
||||||
|
distclean-generic:
|
||||||
|
-rm -f Makefile $(DISTCLEANFILES)
|
||||||
|
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||||
|
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||||
|
|
||||||
|
maintainer-clean-generic:
|
||||||
|
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||||
|
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||||
|
mostlyclean: mostlyclean-generic
|
||||||
|
|
||||||
|
clean: clean-generic mostlyclean
|
||||||
|
|
||||||
|
distclean: distclean-generic clean
|
||||||
|
-rm -f config.status
|
||||||
|
-rm -f libtool
|
||||||
|
|
||||||
|
maintainer-clean: maintainer-clean-generic distclean
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
.PHONY: tags distdir info dvi installcheck install-exec install-data \
|
||||||
|
install uninstall all installdirs mostlyclean-generic distclean-generic \
|
||||||
|
clean-generic maintainer-clean-generic clean mostlyclean distclean \
|
||||||
|
maintainer-clean
|
||||||
|
|
||||||
|
|
||||||
|
# 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:
|
||||||
5
etc/pam.d/passwd
Normal file
5
etc/pam.d/passwd
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#%PAM-1.0
|
||||||
|
#[For version 1.0 syntax, the above header is optional]
|
||||||
|
# $Id: passwd,v 1.1 1998/07/23 22:13:15 marekm Exp $
|
||||||
|
# /etc/pam.d/passwd - sample PAM config file for the `passwd' service
|
||||||
|
password required pam_unix_passwd.so
|
||||||
7
etc/pam.d/su
Normal file
7
etc/pam.d/su
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#%PAM-1.0
|
||||||
|
#[For version 1.0 syntax, the above header is optional]
|
||||||
|
# $Id: su,v 1.1 1998/07/23 22:13:15 marekm Exp $
|
||||||
|
# /etc/pam.d/su - sample PAM config file for the `su' service
|
||||||
|
auth sufficient pam_rootok.so
|
||||||
|
auth required pam_unix_auth.so
|
||||||
|
account required pam_unix_acct.so
|
||||||
10
etc/shells
Normal file
10
etc/shells
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# /etc/shells: valid login shells
|
||||||
|
/bin/ash
|
||||||
|
/bin/bash
|
||||||
|
/bin/csh
|
||||||
|
/bin/sh
|
||||||
|
/usr/bin/es
|
||||||
|
/usr/bin/ksh
|
||||||
|
/usr/bin/rc
|
||||||
|
/usr/bin/tcsh
|
||||||
|
/usr/bin/zsh
|
||||||
4
etc/suauth
Normal file
4
etc/suauth
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# /etc/suauth - secure-su control file. See suauth(5) for full documentation.
|
||||||
|
|
||||||
|
# Uncommenting this line will only allow members of group root to su to root.
|
||||||
|
# root:ALL EXCEPT GROUP root:DENY
|
||||||
250
install-sh
Executable file
250
install-sh
Executable file
@@ -0,0 +1,250 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# install - install a program, script, or datafile
|
||||||
|
# This comes from X11R5 (mit/util/scripts/install.sh).
|
||||||
|
#
|
||||||
|
# Copyright 1991 by the Massachusetts Institute of Technology
|
||||||
|
#
|
||||||
|
# Permission to use, copy, modify, distribute, and sell this software and its
|
||||||
|
# documentation for any purpose is hereby granted without fee, provided that
|
||||||
|
# the above copyright notice appear in all copies and that both that
|
||||||
|
# copyright notice and this permission notice appear in supporting
|
||||||
|
# documentation, and that the name of M.I.T. not be used in advertising or
|
||||||
|
# publicity pertaining to distribution of the software without specific,
|
||||||
|
# written prior permission. M.I.T. makes no representations about the
|
||||||
|
# suitability of this software for any purpose. It is provided "as is"
|
||||||
|
# without express or implied warranty.
|
||||||
|
#
|
||||||
|
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||||
|
# `make' implicit rules from creating a file called install from it
|
||||||
|
# when there is no Makefile.
|
||||||
|
#
|
||||||
|
# This script is compatible with the BSD install script, but was written
|
||||||
|
# from scratch. It can only install one file at a time, a restriction
|
||||||
|
# shared with many OS's install programs.
|
||||||
|
|
||||||
|
|
||||||
|
# set DOITPROG to echo to test this script
|
||||||
|
|
||||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||||
|
doit="${DOITPROG-}"
|
||||||
|
|
||||||
|
|
||||||
|
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||||
|
|
||||||
|
mvprog="${MVPROG-mv}"
|
||||||
|
cpprog="${CPPROG-cp}"
|
||||||
|
chmodprog="${CHMODPROG-chmod}"
|
||||||
|
chownprog="${CHOWNPROG-chown}"
|
||||||
|
chgrpprog="${CHGRPPROG-chgrp}"
|
||||||
|
stripprog="${STRIPPROG-strip}"
|
||||||
|
rmprog="${RMPROG-rm}"
|
||||||
|
mkdirprog="${MKDIRPROG-mkdir}"
|
||||||
|
|
||||||
|
transformbasename=""
|
||||||
|
transform_arg=""
|
||||||
|
instcmd="$mvprog"
|
||||||
|
chmodcmd="$chmodprog 0755"
|
||||||
|
chowncmd=""
|
||||||
|
chgrpcmd=""
|
||||||
|
stripcmd=""
|
||||||
|
rmcmd="$rmprog -f"
|
||||||
|
mvcmd="$mvprog"
|
||||||
|
src=""
|
||||||
|
dst=""
|
||||||
|
dir_arg=""
|
||||||
|
|
||||||
|
while [ x"$1" != x ]; do
|
||||||
|
case $1 in
|
||||||
|
-c) instcmd="$cpprog"
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-d) dir_arg=true
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-m) chmodcmd="$chmodprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-o) chowncmd="$chownprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-g) chgrpcmd="$chgrpprog $2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-s) stripcmd="$stripprog"
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
|
||||||
|
*) if [ x"$src" = x ]
|
||||||
|
then
|
||||||
|
src=$1
|
||||||
|
else
|
||||||
|
# this colon is to work around a 386BSD /bin/sh bug
|
||||||
|
:
|
||||||
|
dst=$1
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
continue;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ x"$src" = x ]
|
||||||
|
then
|
||||||
|
echo "install: no input file specified"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dir_arg" != x ]; then
|
||||||
|
dst=$src
|
||||||
|
src=""
|
||||||
|
|
||||||
|
if [ -d $dst ]; then
|
||||||
|
instcmd=:
|
||||||
|
else
|
||||||
|
instcmd=mkdir
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
|
||||||
|
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
||||||
|
# might cause directories to be created, which would be especially bad
|
||||||
|
# if $src (and thus $dsttmp) contains '*'.
|
||||||
|
|
||||||
|
if [ -f $src -o -d $src ]
|
||||||
|
then
|
||||||
|
true
|
||||||
|
else
|
||||||
|
echo "install: $src does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dst" = x ]
|
||||||
|
then
|
||||||
|
echo "install: no destination specified"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If destination is a directory, append the input filename; if your system
|
||||||
|
# does not like double slashes in filenames, you may need to add some logic
|
||||||
|
|
||||||
|
if [ -d $dst ]
|
||||||
|
then
|
||||||
|
dst="$dst"/`basename $src`
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
## this sed command emulates the dirname command
|
||||||
|
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||||
|
|
||||||
|
# Make sure that the destination directory exists.
|
||||||
|
# this part is taken from Noah Friedman's mkinstalldirs script
|
||||||
|
|
||||||
|
# Skip lots of stat calls in the usual case.
|
||||||
|
if [ ! -d "$dstdir" ]; then
|
||||||
|
defaultIFS='
|
||||||
|
'
|
||||||
|
IFS="${IFS-${defaultIFS}}"
|
||||||
|
|
||||||
|
oIFS="${IFS}"
|
||||||
|
# Some sh's can't handle IFS=/ for some reason.
|
||||||
|
IFS='%'
|
||||||
|
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||||
|
IFS="${oIFS}"
|
||||||
|
|
||||||
|
pathcomp=''
|
||||||
|
|
||||||
|
while [ $# -ne 0 ] ; do
|
||||||
|
pathcomp="${pathcomp}${1}"
|
||||||
|
shift
|
||||||
|
|
||||||
|
if [ ! -d "${pathcomp}" ] ;
|
||||||
|
then
|
||||||
|
$mkdirprog "${pathcomp}"
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
pathcomp="${pathcomp}/"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ x"$dir_arg" != x ]
|
||||||
|
then
|
||||||
|
$doit $instcmd $dst &&
|
||||||
|
|
||||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
|
||||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
|
||||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
|
||||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
|
||||||
|
else
|
||||||
|
|
||||||
|
# If we're going to rename the final executable, determine the name now.
|
||||||
|
|
||||||
|
if [ x"$transformarg" = x ]
|
||||||
|
then
|
||||||
|
dstfile=`basename $dst`
|
||||||
|
else
|
||||||
|
dstfile=`basename $dst $transformbasename |
|
||||||
|
sed $transformarg`$transformbasename
|
||||||
|
fi
|
||||||
|
|
||||||
|
# don't allow the sed command to completely eliminate the filename
|
||||||
|
|
||||||
|
if [ x"$dstfile" = x ]
|
||||||
|
then
|
||||||
|
dstfile=`basename $dst`
|
||||||
|
else
|
||||||
|
true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make a temp file name in the proper directory.
|
||||||
|
|
||||||
|
dsttmp=$dstdir/#inst.$$#
|
||||||
|
|
||||||
|
# Move or copy the file name to the temp name
|
||||||
|
|
||||||
|
$doit $instcmd $src $dsttmp &&
|
||||||
|
|
||||||
|
trap "rm -f ${dsttmp}" 0 &&
|
||||||
|
|
||||||
|
# and set any options; do chmod last to preserve setuid bits
|
||||||
|
|
||||||
|
# If any of these fail, we abort the whole thing. If we want to
|
||||||
|
# ignore errors from any of these, just make sure not to ignore
|
||||||
|
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
||||||
|
|
||||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
|
||||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
|
||||||
|
|
||||||
|
# Now rename the file to the real destination.
|
||||||
|
|
||||||
|
$doit $rmcmd -f $dstdir/$dstfile &&
|
||||||
|
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
||||||
|
|
||||||
|
fi &&
|
||||||
|
|
||||||
|
|
||||||
|
exit 0
|
||||||
1086
intl/ChangeLog
Normal file
1086
intl/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
214
intl/Makefile.in
Normal file
214
intl/Makefile.in
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
# Makefile for directory with message catalog handling in GNU NLS Utilities.
|
||||||
|
# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
top_builddir = ..
|
||||||
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
libdir = $(exec_prefix)/lib
|
||||||
|
includedir = $(prefix)/include
|
||||||
|
datadir = $(prefix)/@DATADIRNAME@
|
||||||
|
localedir = $(datadir)/locale
|
||||||
|
gnulocaledir = $(prefix)/share/locale
|
||||||
|
gettextsrcdir = @datadir@/gettext/intl
|
||||||
|
aliaspath = $(localedir):.
|
||||||
|
subdir = intl
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
|
|
||||||
|
l = @l@
|
||||||
|
|
||||||
|
AR = ar
|
||||||
|
CC = @CC@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
|
||||||
|
DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \
|
||||||
|
-DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
|
||||||
|
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
|
||||||
|
|
||||||
|
HEADERS = $(COMHDRS) libgettext.h loadinfo.h
|
||||||
|
COMHDRS = gettext.h gettextP.h hash-string.h
|
||||||
|
SOURCES = $(COMSRCS) intl-compat.c cat-compat.c
|
||||||
|
COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \
|
||||||
|
finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \
|
||||||
|
explodename.c
|
||||||
|
OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \
|
||||||
|
finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \
|
||||||
|
explodename.$lo
|
||||||
|
CATOBJS = cat-compat.$lo ../po/cat-id-tbl.$lo
|
||||||
|
GETTOBJS = intl-compat.$lo
|
||||||
|
DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \
|
||||||
|
xopen-msg.sed $(HEADERS) $(SOURCES)
|
||||||
|
DISTFILES.normal = VERSION
|
||||||
|
DISTFILES.gettext = libintl.glibc intlh.inst.in
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .o .lo
|
||||||
|
.c.o:
|
||||||
|
$(COMPILE) $<
|
||||||
|
.c.lo:
|
||||||
|
$(LIBTOOL) --mode=compile $(COMPILE) $<
|
||||||
|
|
||||||
|
INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib
|
||||||
|
|
||||||
|
all: all-@USE_INCLUDED_LIBINTL@
|
||||||
|
|
||||||
|
all-yes: libintl.$la intlh.inst
|
||||||
|
all-no:
|
||||||
|
|
||||||
|
libintl.a: $(OBJECTS)
|
||||||
|
rm -f $@
|
||||||
|
$(AR) cru $@ $(OBJECTS)
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
libintl.la: $(OBJECTS)
|
||||||
|
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $(OBJECTS) \
|
||||||
|
-version-info 1:0 -rpath $(libdir)
|
||||||
|
|
||||||
|
../po/cat-id-tbl.$lo: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot
|
||||||
|
cd ../po && $(MAKE) cat-id-tbl.$lo
|
||||||
|
|
||||||
|
check: all
|
||||||
|
|
||||||
|
# This installation goal is only used in GNU gettext. Packages which
|
||||||
|
# only use the library should use install instead.
|
||||||
|
|
||||||
|
# We must not install the libintl.h/libintl.a files if we are on a
|
||||||
|
# system which has the gettext() function in its C library or in a
|
||||||
|
# separate library or use the catgets interface. A special case is
|
||||||
|
# where configure found a previously installed GNU gettext library.
|
||||||
|
# If you want to use the one which comes with this version of the
|
||||||
|
# package, you have to use `configure --with-included-gettext'.
|
||||||
|
install: install-exec install-data
|
||||||
|
install-exec: all
|
||||||
|
if test "$(PACKAGE)" = "gettext" \
|
||||||
|
&& test '@INTLOBJS@' = '$(GETTOBJS)'; then \
|
||||||
|
if test -r $(MKINSTALLDIRS); then \
|
||||||
|
$(MKINSTALLDIRS) $(libdir) $(includedir); \
|
||||||
|
else \
|
||||||
|
$(top_srcdir)/mkinstalldirs $(libdir) $(includedir); \
|
||||||
|
fi; \
|
||||||
|
$(INSTALL_DATA) intlh.inst $(includedir)/libintl.h; \
|
||||||
|
$(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \
|
||||||
|
else \
|
||||||
|
: ; \
|
||||||
|
fi
|
||||||
|
install-data: all
|
||||||
|
if test "$(PACKAGE)" = "gettext"; then \
|
||||||
|
if test -r $(MKINSTALLDIRS); then \
|
||||||
|
$(MKINSTALLDIRS) $(gettextsrcdir); \
|
||||||
|
else \
|
||||||
|
$(top_srcdir)/mkinstalldirs $(gettextsrcdir); \
|
||||||
|
fi; \
|
||||||
|
$(INSTALL_DATA) VERSION $(gettextsrcdir)/VERSION; \
|
||||||
|
dists="$(DISTFILES.common)"; \
|
||||||
|
for file in $$dists; do \
|
||||||
|
$(INSTALL_DATA) $(srcdir)/$$file $(gettextsrcdir)/$$file; \
|
||||||
|
done; \
|
||||||
|
else \
|
||||||
|
: ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define this as empty until I found a useful application.
|
||||||
|
installcheck:
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
dists="$(DISTFILES.common)"; \
|
||||||
|
for file in $$dists; do \
|
||||||
|
rm -f $(gettextsrcdir)/$$file; \
|
||||||
|
done
|
||||||
|
|
||||||
|
info dvi:
|
||||||
|
|
||||||
|
$(OBJECTS): ../config.h libgettext.h
|
||||||
|
bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h
|
||||||
|
dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES)
|
||||||
|
here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
|
||||||
|
|
||||||
|
id: ID
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES)
|
||||||
|
here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean:
|
||||||
|
rm -f *.a *.o *.lo core core.*
|
||||||
|
|
||||||
|
clean: mostlyclean
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f Makefile ID TAGS po2msg.sed po2tbl.sed
|
||||||
|
|
||||||
|
maintainer-clean: distclean
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
|
||||||
|
# GNU gettext needs not contain the file `VERSION' but contains some
|
||||||
|
# other files which should not be distributed in other packages.
|
||||||
|
distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
dist distdir: Makefile $(DISTFILES)
|
||||||
|
if test "$(PACKAGE)" = gettext; then \
|
||||||
|
additional="$(DISTFILES.gettext)"; \
|
||||||
|
else \
|
||||||
|
additional="$(DISTFILES.normal)"; \
|
||||||
|
fi; \
|
||||||
|
for file in $(DISTFILES.common) $$additional; do \
|
||||||
|
ln $(srcdir)/$$file $(distdir) 2> /dev/null \
|
||||||
|
|| cp -p $(srcdir)/$$file $(distdir); \
|
||||||
|
done
|
||||||
|
|
||||||
|
dist-libc:
|
||||||
|
tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc
|
||||||
|
|
||||||
|
Makefile: Makefile.in ../config.status
|
||||||
|
cd .. \
|
||||||
|
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
# The dependency for intlh.inst is different in gettext and all other
|
||||||
|
# packages. Because we cannot you GNU make features we have to solve
|
||||||
|
# the problem while rewriting Makefile.in.
|
||||||
|
@GT_YES@intlh.inst: intlh.inst.in ../config.status
|
||||||
|
@GT_YES@ cd .. \
|
||||||
|
@GT_YES@ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \
|
||||||
|
@GT_YES@ $(SHELL) ./config.status
|
||||||
|
@GT_NO@.PHONY: intlh.inst
|
||||||
|
@GT_NO@intlh.inst:
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make not to export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
||||||
1
intl/VERSION
Normal file
1
intl/VERSION
Normal file
@@ -0,0 +1 @@
|
|||||||
|
GNU gettext library from gettext-0.10.35
|
||||||
203
intl/bindtextdom.c
Normal file
203
intl/bindtextdom.c
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
/* Implementation of the bindtextdomain(3) function
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
void free ();
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
# ifndef memcpy
|
||||||
|
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "gettextP.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* Contains the default location of the message catalogs. */
|
||||||
|
extern const char _nl_default_dirname[];
|
||||||
|
|
||||||
|
/* List with bindings of specific domains. */
|
||||||
|
extern struct binding *_nl_domain_bindings;
|
||||||
|
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define BINDTEXTDOMAIN __bindtextdomain
|
||||||
|
# ifndef strdup
|
||||||
|
# define strdup(str) __strdup (str)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define BINDTEXTDOMAIN bindtextdomain__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specify that the DOMAINNAME message catalog will be found
|
||||||
|
in DIRNAME rather than in the system locale data base. */
|
||||||
|
char *
|
||||||
|
BINDTEXTDOMAIN (domainname, dirname)
|
||||||
|
const char *domainname;
|
||||||
|
const char *dirname;
|
||||||
|
{
|
||||||
|
struct binding *binding;
|
||||||
|
|
||||||
|
/* Some sanity checks. */
|
||||||
|
if (domainname == NULL || domainname[0] == '\0')
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
|
||||||
|
{
|
||||||
|
int compare = strcmp (domainname, binding->domainname);
|
||||||
|
if (compare == 0)
|
||||||
|
/* We found it! */
|
||||||
|
break;
|
||||||
|
if (compare < 0)
|
||||||
|
{
|
||||||
|
/* It is not in the list. */
|
||||||
|
binding = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dirname == NULL)
|
||||||
|
/* The current binding has be to returned. */
|
||||||
|
return binding == NULL ? (char *) _nl_default_dirname : binding->dirname;
|
||||||
|
|
||||||
|
if (binding != NULL)
|
||||||
|
{
|
||||||
|
/* The domain is already bound. If the new value and the old
|
||||||
|
one are equal we simply do nothing. Otherwise replace the
|
||||||
|
old binding. */
|
||||||
|
if (strcmp (dirname, binding->dirname) != 0)
|
||||||
|
{
|
||||||
|
char *new_dirname;
|
||||||
|
|
||||||
|
if (strcmp (dirname, _nl_default_dirname) == 0)
|
||||||
|
new_dirname = (char *) _nl_default_dirname;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
new_dirname = strdup (dirname);
|
||||||
|
if (new_dirname == NULL)
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
size_t len = strlen (dirname) + 1;
|
||||||
|
new_dirname = (char *) malloc (len);
|
||||||
|
if (new_dirname == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memcpy (new_dirname, dirname, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding->dirname != _nl_default_dirname)
|
||||||
|
free (binding->dirname);
|
||||||
|
|
||||||
|
binding->dirname = new_dirname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We have to create a new binding. */
|
||||||
|
#if !defined _LIBC && !defined HAVE_STRDUP
|
||||||
|
size_t len;
|
||||||
|
#endif
|
||||||
|
struct binding *new_binding =
|
||||||
|
(struct binding *) malloc (sizeof (*new_binding));
|
||||||
|
|
||||||
|
if (new_binding == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
new_binding->domainname = strdup (domainname);
|
||||||
|
if (new_binding->domainname == NULL)
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
len = strlen (domainname) + 1;
|
||||||
|
new_binding->domainname = (char *) malloc (len);
|
||||||
|
if (new_binding->domainname == NULL)
|
||||||
|
return NULL;
|
||||||
|
memcpy (new_binding->domainname, domainname, len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (strcmp (dirname, _nl_default_dirname) == 0)
|
||||||
|
new_binding->dirname = (char *) _nl_default_dirname;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
new_binding->dirname = strdup (dirname);
|
||||||
|
if (new_binding->dirname == NULL)
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
len = strlen (dirname) + 1;
|
||||||
|
new_binding->dirname = (char *) malloc (len);
|
||||||
|
if (new_binding->dirname == NULL)
|
||||||
|
return NULL;
|
||||||
|
memcpy (new_binding->dirname, dirname, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now enqueue it. */
|
||||||
|
if (_nl_domain_bindings == NULL
|
||||||
|
|| strcmp (domainname, _nl_domain_bindings->domainname) < 0)
|
||||||
|
{
|
||||||
|
new_binding->next = _nl_domain_bindings;
|
||||||
|
_nl_domain_bindings = new_binding;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
binding = _nl_domain_bindings;
|
||||||
|
while (binding->next != NULL
|
||||||
|
&& strcmp (domainname, binding->next->domainname) > 0)
|
||||||
|
binding = binding->next;
|
||||||
|
|
||||||
|
new_binding->next = binding->next;
|
||||||
|
binding->next = new_binding;
|
||||||
|
}
|
||||||
|
|
||||||
|
binding = new_binding;
|
||||||
|
}
|
||||||
|
|
||||||
|
return binding->dirname;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__bindtextdomain, bindtextdomain);
|
||||||
|
#endif
|
||||||
262
intl/cat-compat.c
Normal file
262
intl/cat-compat.c
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
/* Compatibility code for gettext-using-catgets interface.
|
||||||
|
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef STDC_HEADERS
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
char *getenv ();
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_NL_TYPES_H
|
||||||
|
# include <nl_types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libgettext.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* XPG3 defines the result of `setlocale (category, NULL)' as:
|
||||||
|
``Directs `setlocale()' to query `category' and return the current
|
||||||
|
setting of `local'.''
|
||||||
|
However it does not specify the exact format. And even worse: POSIX
|
||||||
|
defines this not at all. So we can use this feature only on selected
|
||||||
|
system (e.g. those using GNU C Library). */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define HAVE_LOCALE_NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The catalog descriptor. */
|
||||||
|
static nl_catd catalog = (nl_catd) -1;
|
||||||
|
|
||||||
|
/* Name of the default catalog. */
|
||||||
|
static const char default_catalog_name[] = "messages";
|
||||||
|
|
||||||
|
/* Name of currently used catalog. */
|
||||||
|
static const char *catalog_name = default_catalog_name;
|
||||||
|
|
||||||
|
/* Get ID for given string. If not found return -1. */
|
||||||
|
static int msg_to_cat_id PARAMS ((const char *msg));
|
||||||
|
|
||||||
|
/* Substitution for systems lacking this function in their C library. */
|
||||||
|
#if !_LIBC && !HAVE_STPCPY
|
||||||
|
static char *stpcpy PARAMS ((char *dest, const char *src));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Set currently used domain/catalog. */
|
||||||
|
char *
|
||||||
|
textdomain (domainname)
|
||||||
|
const char *domainname;
|
||||||
|
{
|
||||||
|
nl_catd new_catalog;
|
||||||
|
char *new_name;
|
||||||
|
size_t new_name_len;
|
||||||
|
char *lang;
|
||||||
|
|
||||||
|
#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \
|
||||||
|
&& defined HAVE_LOCALE_NULL
|
||||||
|
lang = setlocale (LC_MESSAGES, NULL);
|
||||||
|
#else
|
||||||
|
lang = getenv ("LC_ALL");
|
||||||
|
if (lang == NULL || lang[0] == '\0')
|
||||||
|
{
|
||||||
|
lang = getenv ("LC_MESSAGES");
|
||||||
|
if (lang == NULL || lang[0] == '\0')
|
||||||
|
lang = getenv ("LANG");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (lang == NULL || lang[0] == '\0')
|
||||||
|
lang = "C";
|
||||||
|
|
||||||
|
/* See whether name of currently used domain is asked. */
|
||||||
|
if (domainname == NULL)
|
||||||
|
return (char *) catalog_name;
|
||||||
|
|
||||||
|
if (domainname[0] == '\0')
|
||||||
|
domainname = default_catalog_name;
|
||||||
|
|
||||||
|
/* Compute length of added path element. */
|
||||||
|
new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang)
|
||||||
|
+ sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1
|
||||||
|
+ sizeof (".cat");
|
||||||
|
|
||||||
|
new_name = (char *) malloc (new_name_len);
|
||||||
|
if (new_name == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
strcpy (new_name, PACKAGE);
|
||||||
|
new_catalog = catopen (new_name, 0);
|
||||||
|
|
||||||
|
if (new_catalog == (nl_catd) -1)
|
||||||
|
{
|
||||||
|
/* NLSPATH search didn't work, try absolute path */
|
||||||
|
sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang,
|
||||||
|
PACKAGE);
|
||||||
|
new_catalog = catopen (new_name, 0);
|
||||||
|
|
||||||
|
if (new_catalog == (nl_catd) -1)
|
||||||
|
{
|
||||||
|
free (new_name);
|
||||||
|
return (char *) catalog_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close old catalog. */
|
||||||
|
if (catalog != (nl_catd) -1)
|
||||||
|
catclose (catalog);
|
||||||
|
if (catalog_name != default_catalog_name)
|
||||||
|
free ((char *) catalog_name);
|
||||||
|
|
||||||
|
catalog = new_catalog;
|
||||||
|
catalog_name = new_name;
|
||||||
|
|
||||||
|
return (char *) catalog_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
bindtextdomain (domainname, dirname)
|
||||||
|
const char *domainname;
|
||||||
|
const char *dirname;
|
||||||
|
{
|
||||||
|
#if HAVE_SETENV || HAVE_PUTENV
|
||||||
|
char *old_val, *new_val, *cp;
|
||||||
|
size_t new_val_len;
|
||||||
|
|
||||||
|
/* This does not make much sense here but to be compatible do it. */
|
||||||
|
if (domainname == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Compute length of added path element. If we use setenv we don't need
|
||||||
|
the first byts for NLSPATH=, but why complicate the code for this
|
||||||
|
peanuts. */
|
||||||
|
new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname)
|
||||||
|
+ sizeof ("/%L/LC_MESSAGES/%N.cat");
|
||||||
|
|
||||||
|
old_val = getenv ("NLSPATH");
|
||||||
|
if (old_val == NULL || old_val[0] == '\0')
|
||||||
|
{
|
||||||
|
old_val = NULL;
|
||||||
|
new_val_len += 1 + sizeof (LOCALEDIR) - 1
|
||||||
|
+ sizeof ("/%L/LC_MESSAGES/%N.cat");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
new_val_len += strlen (old_val);
|
||||||
|
|
||||||
|
new_val = (char *) malloc (new_val_len);
|
||||||
|
if (new_val == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
# if HAVE_SETENV
|
||||||
|
cp = new_val;
|
||||||
|
# else
|
||||||
|
cp = stpcpy (new_val, "NLSPATH=");
|
||||||
|
# endif
|
||||||
|
|
||||||
|
cp = stpcpy (cp, dirname);
|
||||||
|
cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:");
|
||||||
|
|
||||||
|
if (old_val == NULL)
|
||||||
|
{
|
||||||
|
# if __STDC__
|
||||||
|
stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat");
|
||||||
|
# else
|
||||||
|
|
||||||
|
cp = stpcpy (cp, LOCALEDIR);
|
||||||
|
stpcpy (cp, "/%L/LC_MESSAGES/%N.cat");
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
stpcpy (cp, old_val);
|
||||||
|
|
||||||
|
# if HAVE_SETENV
|
||||||
|
setenv ("NLSPATH", new_val, 1);
|
||||||
|
free (new_val);
|
||||||
|
# else
|
||||||
|
putenv (new_val);
|
||||||
|
/* Do *not* free the environment entry we just entered. It is used
|
||||||
|
from now on. */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (char *) domainname;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef gettext
|
||||||
|
char *
|
||||||
|
gettext (msg)
|
||||||
|
const char *msg;
|
||||||
|
{
|
||||||
|
int msgid;
|
||||||
|
|
||||||
|
if (msg == NULL || catalog == (nl_catd) -1)
|
||||||
|
return (char *) msg;
|
||||||
|
|
||||||
|
/* Get the message from the catalog. We always use set number 1.
|
||||||
|
The message ID is computed by the function `msg_to_cat_id'
|
||||||
|
which works on the table generated by `po-to-tbl'. */
|
||||||
|
msgid = msg_to_cat_id (msg);
|
||||||
|
if (msgid == -1)
|
||||||
|
return (char *) msg;
|
||||||
|
|
||||||
|
return catgets (catalog, 1, msgid, (char *) msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries
|
||||||
|
for the one equal to msg. If it is found return the ID. In case when
|
||||||
|
the string is not found return -1. */
|
||||||
|
static int
|
||||||
|
msg_to_cat_id (msg)
|
||||||
|
const char *msg;
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
for (cnt = 0; cnt < _msg_tbl_length; ++cnt)
|
||||||
|
if (strcmp (msg, _msg_tbl[cnt]._msg) == 0)
|
||||||
|
return _msg_tbl[cnt]._msg_number;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
/* We don't want libintl.a to depend on any other library. So we
|
||||||
|
avoid the non-standard function stpcpy. In GNU C Library this
|
||||||
|
function is available, though. Also allow the symbol HAVE_STPCPY
|
||||||
|
to be defined. */
|
||||||
|
#if !_LIBC && !HAVE_STPCPY
|
||||||
|
static char *
|
||||||
|
stpcpy (dest, src)
|
||||||
|
char *dest;
|
||||||
|
const char *src;
|
||||||
|
{
|
||||||
|
while ((*dest++ = *src++) != '\0')
|
||||||
|
/* Do nothing. */ ;
|
||||||
|
return dest - 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
655
intl/dcgettext.c
Normal file
655
intl/dcgettext.c
Normal file
@@ -0,0 +1,655 @@
|
|||||||
|
/* Implementation of the dcgettext(3) function.
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined __GNUC__ && !defined C_ALLOCA
|
||||||
|
# define alloca __builtin_alloca
|
||||||
|
# define HAVE_ALLOCA 1
|
||||||
|
#else
|
||||||
|
# if (defined HAVE_ALLOCA_H || defined _LIBC) && !defined C_ALLOCA
|
||||||
|
# include <alloca.h>
|
||||||
|
# else
|
||||||
|
# ifdef _AIX
|
||||||
|
#pragma alloca
|
||||||
|
# else
|
||||||
|
# ifndef alloca
|
||||||
|
char *alloca ();
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#ifndef errno
|
||||||
|
extern int errno;
|
||||||
|
#endif
|
||||||
|
#ifndef __set_errno
|
||||||
|
# define __set_errno(val) errno = (val)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
char *getenv ();
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
void free ();
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE 1
|
||||||
|
# endif
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
#endif
|
||||||
|
#if !HAVE_STRCHR && !defined _LIBC
|
||||||
|
# ifndef strchr
|
||||||
|
# define strchr index
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_UNISTD_H || defined _LIBC
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "gettextP.h"
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
#include "hash-string.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Rename the non ANSI C functions. This is required by the standard
|
||||||
|
because some ANSI C functions will require linking with this object
|
||||||
|
file and the name space must not be polluted. */
|
||||||
|
# define getcwd __getcwd
|
||||||
|
# ifndef stpcpy
|
||||||
|
# define stpcpy __stpcpy
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# if !defined HAVE_GETCWD
|
||||||
|
char *getwd ();
|
||||||
|
# define getcwd(buf, max) getwd (buf)
|
||||||
|
# else
|
||||||
|
char *getcwd ();
|
||||||
|
# endif
|
||||||
|
# ifndef HAVE_STPCPY
|
||||||
|
static char *stpcpy PARAMS ((char *dest, const char *src));
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Amount to increase buffer size by in each try. */
|
||||||
|
#define PATH_INCR 32
|
||||||
|
|
||||||
|
/* The following is from pathmax.h. */
|
||||||
|
/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
|
||||||
|
PATH_MAX but might cause redefinition warnings when sys/param.h is
|
||||||
|
later included (as on MORE/BSD 4.3). */
|
||||||
|
#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__))
|
||||||
|
# include <limits.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _POSIX_PATH_MAX
|
||||||
|
# define _POSIX_PATH_MAX 255
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(PATH_MAX) && defined(_PC_PATH_MAX)
|
||||||
|
# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Don't include sys/param.h if it already has been. */
|
||||||
|
#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN)
|
||||||
|
# include <sys/param.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(PATH_MAX) && defined(MAXPATHLEN)
|
||||||
|
# define PATH_MAX MAXPATHLEN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PATH_MAX
|
||||||
|
# define PATH_MAX _POSIX_PATH_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* XPG3 defines the result of `setlocale (category, NULL)' as:
|
||||||
|
``Directs `setlocale()' to query `category' and return the current
|
||||||
|
setting of `local'.''
|
||||||
|
However it does not specify the exact format. And even worse: POSIX
|
||||||
|
defines this not at all. So we can use this feature only on selected
|
||||||
|
system (e.g. those using GNU C Library). */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define HAVE_LOCALE_NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Name of the default domain used for gettext(3) prior any call to
|
||||||
|
textdomain(3). The default value for this is "messages". */
|
||||||
|
const char _nl_default_default_domain[] = "messages";
|
||||||
|
|
||||||
|
/* Value used as the default domain for gettext(3). */
|
||||||
|
const char *_nl_current_default_domain = _nl_default_default_domain;
|
||||||
|
|
||||||
|
/* Contains the default location of the message catalogs. */
|
||||||
|
const char _nl_default_dirname[] = GNULOCALEDIR;
|
||||||
|
|
||||||
|
/* List with bindings of specific domains created by bindtextdomain()
|
||||||
|
calls. */
|
||||||
|
struct binding *_nl_domain_bindings;
|
||||||
|
|
||||||
|
/* Prototypes for local functions. */
|
||||||
|
static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file,
|
||||||
|
const char *msgid)) internal_function;
|
||||||
|
static const char *category_to_name PARAMS ((int category)) internal_function;
|
||||||
|
static const char *guess_category_value PARAMS ((int category,
|
||||||
|
const char *categoryname))
|
||||||
|
internal_function;
|
||||||
|
|
||||||
|
|
||||||
|
/* For those loosing systems which don't have `alloca' we have to add
|
||||||
|
some additional code emulating it. */
|
||||||
|
#ifdef HAVE_ALLOCA
|
||||||
|
/* Nothing has to be done. */
|
||||||
|
# define ADD_BLOCK(list, address) /* nothing */
|
||||||
|
# define FREE_BLOCKS(list) /* nothing */
|
||||||
|
#else
|
||||||
|
struct block_list
|
||||||
|
{
|
||||||
|
void *address;
|
||||||
|
struct block_list *next;
|
||||||
|
};
|
||||||
|
# define ADD_BLOCK(list, addr) \
|
||||||
|
do { \
|
||||||
|
struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
|
||||||
|
/* If we cannot get a free block we cannot add the new element to \
|
||||||
|
the list. */ \
|
||||||
|
if (newp != NULL) { \
|
||||||
|
newp->address = (addr); \
|
||||||
|
newp->next = (list); \
|
||||||
|
(list) = newp; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
# define FREE_BLOCKS(list) \
|
||||||
|
do { \
|
||||||
|
while (list != NULL) { \
|
||||||
|
struct block_list *old = list; \
|
||||||
|
list = list->next; \
|
||||||
|
free (old); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
# undef alloca
|
||||||
|
# define alloca(size) (malloc (size))
|
||||||
|
#endif /* have alloca */
|
||||||
|
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define DCGETTEXT __dcgettext
|
||||||
|
#else
|
||||||
|
# define DCGETTEXT dcgettext__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Checking whether the binaries runs SUID must be done and glibc provides
|
||||||
|
easier methods therefore we make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define ENABLE_SECURE __libc_enable_secure
|
||||||
|
# define DETERMINE_SECURE
|
||||||
|
#else
|
||||||
|
static int enable_secure;
|
||||||
|
# define ENABLE_SECURE (enable_secure == 1)
|
||||||
|
# define DETERMINE_SECURE \
|
||||||
|
if (enable_secure == 0) \
|
||||||
|
{ \
|
||||||
|
if (getuid () != geteuid () || getgid () != getegid ()) \
|
||||||
|
enable_secure = 1; \
|
||||||
|
else \
|
||||||
|
enable_secure = -1; \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
|
locale. */
|
||||||
|
char *
|
||||||
|
DCGETTEXT (domainname, msgid, category)
|
||||||
|
const char *domainname;
|
||||||
|
const char *msgid;
|
||||||
|
int category;
|
||||||
|
{
|
||||||
|
#ifndef HAVE_ALLOCA
|
||||||
|
struct block_list *block_list = NULL;
|
||||||
|
#endif
|
||||||
|
struct loaded_l10nfile *domain;
|
||||||
|
struct binding *binding;
|
||||||
|
const char *categoryname;
|
||||||
|
const char *categoryvalue;
|
||||||
|
char *dirname, *xdomainname;
|
||||||
|
char *single_locale;
|
||||||
|
char *retval;
|
||||||
|
int saved_errno = errno;
|
||||||
|
|
||||||
|
/* If no real MSGID is given return NULL. */
|
||||||
|
if (msgid == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* See whether this is a SUID binary or not. */
|
||||||
|
DETERMINE_SECURE;
|
||||||
|
|
||||||
|
/* If DOMAINNAME is NULL, we are interested in the default domain. If
|
||||||
|
CATEGORY is not LC_MESSAGES this might not make much sense but the
|
||||||
|
definition left this undefined. */
|
||||||
|
if (domainname == NULL)
|
||||||
|
domainname = _nl_current_default_domain;
|
||||||
|
|
||||||
|
/* First find matching binding. */
|
||||||
|
for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
|
||||||
|
{
|
||||||
|
int compare = strcmp (domainname, binding->domainname);
|
||||||
|
if (compare == 0)
|
||||||
|
/* We found it! */
|
||||||
|
break;
|
||||||
|
if (compare < 0)
|
||||||
|
{
|
||||||
|
/* It is not in the list. */
|
||||||
|
binding = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding == NULL)
|
||||||
|
dirname = (char *) _nl_default_dirname;
|
||||||
|
else if (binding->dirname[0] == '/')
|
||||||
|
dirname = binding->dirname;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We have a relative path. Make it absolute now. */
|
||||||
|
size_t dirname_len = strlen (binding->dirname) + 1;
|
||||||
|
size_t path_max;
|
||||||
|
char *ret;
|
||||||
|
|
||||||
|
path_max = (unsigned int) PATH_MAX;
|
||||||
|
path_max += 2; /* The getcwd docs say to do this. */
|
||||||
|
|
||||||
|
dirname = (char *) alloca (path_max + dirname_len);
|
||||||
|
ADD_BLOCK (block_list, dirname);
|
||||||
|
|
||||||
|
__set_errno (0);
|
||||||
|
while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)
|
||||||
|
{
|
||||||
|
path_max += PATH_INCR;
|
||||||
|
dirname = (char *) alloca (path_max + dirname_len);
|
||||||
|
ADD_BLOCK (block_list, dirname);
|
||||||
|
__set_errno (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret == NULL)
|
||||||
|
{
|
||||||
|
/* We cannot get the current working directory. Don't signal an
|
||||||
|
error but simply return the default string. */
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
__set_errno (saved_errno);
|
||||||
|
return (char *) msgid;
|
||||||
|
}
|
||||||
|
|
||||||
|
stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now determine the symbolic name of CATEGORY and its value. */
|
||||||
|
categoryname = category_to_name (category);
|
||||||
|
categoryvalue = guess_category_value (category, categoryname);
|
||||||
|
|
||||||
|
xdomainname = (char *) alloca (strlen (categoryname)
|
||||||
|
+ strlen (domainname) + 5);
|
||||||
|
ADD_BLOCK (block_list, xdomainname);
|
||||||
|
|
||||||
|
stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
|
||||||
|
domainname),
|
||||||
|
".mo");
|
||||||
|
|
||||||
|
/* Creating working area. */
|
||||||
|
single_locale = (char *) alloca (strlen (categoryvalue) + 1);
|
||||||
|
ADD_BLOCK (block_list, single_locale);
|
||||||
|
|
||||||
|
|
||||||
|
/* Search for the given string. This is a loop because we perhaps
|
||||||
|
got an ordered list of languages to consider for the translation. */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
/* Make CATEGORYVALUE point to the next element of the list. */
|
||||||
|
while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
|
||||||
|
++categoryvalue;
|
||||||
|
if (categoryvalue[0] == '\0')
|
||||||
|
{
|
||||||
|
/* The whole contents of CATEGORYVALUE has been searched but
|
||||||
|
no valid entry has been found. We solve this situation
|
||||||
|
by implicitly appending a "C" entry, i.e. no translation
|
||||||
|
will take place. */
|
||||||
|
single_locale[0] = 'C';
|
||||||
|
single_locale[1] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *cp = single_locale;
|
||||||
|
while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
|
||||||
|
*cp++ = *categoryvalue++;
|
||||||
|
*cp = '\0';
|
||||||
|
|
||||||
|
/* When this is a SUID binary we must not allow accessing files
|
||||||
|
outside the dedicated directories. */
|
||||||
|
if (ENABLE_SECURE
|
||||||
|
&& (memchr (single_locale, '/',
|
||||||
|
_nl_find_language (single_locale) - single_locale)
|
||||||
|
!= NULL))
|
||||||
|
/* Ingore this entry. */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the current locale value is C (or POSIX) we don't load a
|
||||||
|
domain. Return the MSGID. */
|
||||||
|
if (strcmp (single_locale, "C") == 0
|
||||||
|
|| strcmp (single_locale, "POSIX") == 0)
|
||||||
|
{
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
__set_errno (saved_errno);
|
||||||
|
return (char *) msgid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Find structure describing the message catalog matching the
|
||||||
|
DOMAINNAME and CATEGORY. */
|
||||||
|
domain = _nl_find_domain (dirname, single_locale, xdomainname);
|
||||||
|
|
||||||
|
if (domain != NULL)
|
||||||
|
{
|
||||||
|
retval = find_msg (domain, msgid);
|
||||||
|
|
||||||
|
if (retval == NULL)
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
|
||||||
|
{
|
||||||
|
retval = find_msg (domain->successor[cnt], msgid);
|
||||||
|
|
||||||
|
if (retval != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retval != NULL)
|
||||||
|
{
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
__set_errno (saved_errno);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__dcgettext, dcgettext);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
internal_function
|
||||||
|
find_msg (domain_file, msgid)
|
||||||
|
struct loaded_l10nfile *domain_file;
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
size_t act = 0;
|
||||||
|
size_t top, bottom;
|
||||||
|
struct loaded_domain *domain;
|
||||||
|
|
||||||
|
if (domain_file->decided == 0)
|
||||||
|
_nl_load_domain (domain_file);
|
||||||
|
|
||||||
|
if (domain_file->data == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
domain = (struct loaded_domain *) domain_file->data;
|
||||||
|
|
||||||
|
/* Locate the MSGID and its translation. */
|
||||||
|
if (domain->hash_size > 2 && domain->hash_tab != NULL)
|
||||||
|
{
|
||||||
|
/* Use the hashing table. */
|
||||||
|
nls_uint32 len = strlen (msgid);
|
||||||
|
nls_uint32 hash_val = hash_string (msgid);
|
||||||
|
nls_uint32 idx = hash_val % domain->hash_size;
|
||||||
|
nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
|
||||||
|
nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]);
|
||||||
|
|
||||||
|
if (nstr == 0)
|
||||||
|
/* Hash table entry is empty. */
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
|
||||||
|
&& strcmp (msgid,
|
||||||
|
domain->data + W (domain->must_swap,
|
||||||
|
domain->orig_tab[nstr - 1].offset)) == 0)
|
||||||
|
return (char *) domain->data + W (domain->must_swap,
|
||||||
|
domain->trans_tab[nstr - 1].offset);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (idx >= domain->hash_size - incr)
|
||||||
|
idx -= domain->hash_size - incr;
|
||||||
|
else
|
||||||
|
idx += incr;
|
||||||
|
|
||||||
|
nstr = W (domain->must_swap, domain->hash_tab[idx]);
|
||||||
|
if (nstr == 0)
|
||||||
|
/* Hash table entry is empty. */
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
|
||||||
|
&& strcmp (msgid,
|
||||||
|
domain->data + W (domain->must_swap,
|
||||||
|
domain->orig_tab[nstr - 1].offset))
|
||||||
|
== 0)
|
||||||
|
return (char *) domain->data
|
||||||
|
+ W (domain->must_swap, domain->trans_tab[nstr - 1].offset);
|
||||||
|
}
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now we try the default method: binary search in the sorted
|
||||||
|
array of messages. */
|
||||||
|
bottom = 0;
|
||||||
|
top = domain->nstrings;
|
||||||
|
while (bottom < top)
|
||||||
|
{
|
||||||
|
int cmp_val;
|
||||||
|
|
||||||
|
act = (bottom + top) / 2;
|
||||||
|
cmp_val = strcmp (msgid, domain->data
|
||||||
|
+ W (domain->must_swap,
|
||||||
|
domain->orig_tab[act].offset));
|
||||||
|
if (cmp_val < 0)
|
||||||
|
top = act;
|
||||||
|
else if (cmp_val > 0)
|
||||||
|
bottom = act + 1;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If an translation is found return this. */
|
||||||
|
return bottom >= top ? NULL : (char *) domain->data
|
||||||
|
+ W (domain->must_swap,
|
||||||
|
domain->trans_tab[act].offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return string representation of locale CATEGORY. */
|
||||||
|
static const char *
|
||||||
|
internal_function
|
||||||
|
category_to_name (category)
|
||||||
|
int category;
|
||||||
|
{
|
||||||
|
const char *retval;
|
||||||
|
|
||||||
|
switch (category)
|
||||||
|
{
|
||||||
|
#ifdef LC_COLLATE
|
||||||
|
case LC_COLLATE:
|
||||||
|
retval = "LC_COLLATE";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_CTYPE
|
||||||
|
case LC_CTYPE:
|
||||||
|
retval = "LC_CTYPE";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_MONETARY
|
||||||
|
case LC_MONETARY:
|
||||||
|
retval = "LC_MONETARY";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_NUMERIC
|
||||||
|
case LC_NUMERIC:
|
||||||
|
retval = "LC_NUMERIC";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_TIME
|
||||||
|
case LC_TIME:
|
||||||
|
retval = "LC_TIME";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_MESSAGES
|
||||||
|
case LC_MESSAGES:
|
||||||
|
retval = "LC_MESSAGES";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_RESPONSE
|
||||||
|
case LC_RESPONSE:
|
||||||
|
retval = "LC_RESPONSE";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_ALL
|
||||||
|
case LC_ALL:
|
||||||
|
/* This might not make sense but is perhaps better than any other
|
||||||
|
value. */
|
||||||
|
retval = "LC_ALL";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
/* If you have a better idea for a default value let me know. */
|
||||||
|
retval = "LC_XXX";
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Guess value of current locale from value of the environment variables. */
|
||||||
|
static const char *
|
||||||
|
internal_function
|
||||||
|
guess_category_value (category, categoryname)
|
||||||
|
int category;
|
||||||
|
const char *categoryname;
|
||||||
|
{
|
||||||
|
const char *retval;
|
||||||
|
|
||||||
|
/* The highest priority value is the `LANGUAGE' environment
|
||||||
|
variable. This is a GNU extension. */
|
||||||
|
retval = getenv ("LANGUAGE");
|
||||||
|
if (retval != NULL && retval[0] != '\0')
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* `LANGUAGE' is not set. So we have to proceed with the POSIX
|
||||||
|
methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some
|
||||||
|
systems this can be done by the `setlocale' function itself. */
|
||||||
|
#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
|
||||||
|
return setlocale (category, NULL);
|
||||||
|
#else
|
||||||
|
/* Setting of LC_ALL overwrites all other. */
|
||||||
|
retval = getenv ("LC_ALL");
|
||||||
|
if (retval != NULL && retval[0] != '\0')
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* Next comes the name of the desired category. */
|
||||||
|
retval = getenv (categoryname);
|
||||||
|
if (retval != NULL && retval[0] != '\0')
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* Last possibility is the LANG environment variable. */
|
||||||
|
retval = getenv ("LANG");
|
||||||
|
if (retval != NULL && retval[0] != '\0')
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* We use C as the default domain. POSIX says this is implementation
|
||||||
|
defined. */
|
||||||
|
return "C";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
/* We don't want libintl.a to depend on any other library. So we
|
||||||
|
avoid the non-standard function stpcpy. In GNU C Library this
|
||||||
|
function is available, though. Also allow the symbol HAVE_STPCPY
|
||||||
|
to be defined. */
|
||||||
|
#if !_LIBC && !HAVE_STPCPY
|
||||||
|
static char *
|
||||||
|
stpcpy (dest, src)
|
||||||
|
char *dest;
|
||||||
|
const char *src;
|
||||||
|
{
|
||||||
|
while ((*dest++ = *src++) != '\0')
|
||||||
|
/* Do nothing. */ ;
|
||||||
|
return dest - 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* If we want to free all resources we have to do some work at
|
||||||
|
program's end. */
|
||||||
|
static void __attribute__ ((unused))
|
||||||
|
free_mem (void)
|
||||||
|
{
|
||||||
|
struct binding *runp;
|
||||||
|
|
||||||
|
for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next)
|
||||||
|
{
|
||||||
|
free (runp->domainname);
|
||||||
|
if (runp->dirname != _nl_default_dirname)
|
||||||
|
/* Yes, this is a pointer comparison. */
|
||||||
|
free (runp->dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_nl_current_default_domain != _nl_default_default_domain)
|
||||||
|
/* Yes, again a pointer comparison. */
|
||||||
|
free ((char *) _nl_current_default_domain);
|
||||||
|
}
|
||||||
|
|
||||||
|
text_set_element (__libc_subfreeres, free_mem);
|
||||||
|
#endif
|
||||||
59
intl/dgettext.c
Normal file
59
intl/dgettext.c
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/* Implementation of the dgettext(3) function
|
||||||
|
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_LOCALE_H || defined _LIBC
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define DGETTEXT __dgettext
|
||||||
|
# define DCGETTEXT __dcgettext
|
||||||
|
#else
|
||||||
|
# define DGETTEXT dgettext__
|
||||||
|
# define DCGETTEXT dcgettext__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog of the current
|
||||||
|
LC_MESSAGES locale. */
|
||||||
|
char *
|
||||||
|
DGETTEXT (domainname, msgid)
|
||||||
|
const char *domainname;
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
return DCGETTEXT (domainname, msgid, LC_MESSAGES);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__dgettext, dgettext);
|
||||||
|
#endif
|
||||||
197
intl/explodename.c
Normal file
197
intl/explodename.c
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
#endif
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "loadinfo.h"
|
||||||
|
|
||||||
|
/* On some strange systems still no definition of NULL is found. Sigh! */
|
||||||
|
#ifndef NULL
|
||||||
|
# if defined __STDC__ && __STDC__
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# else
|
||||||
|
# define NULL 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
char *
|
||||||
|
_nl_find_language (const char *name)
|
||||||
|
{
|
||||||
|
while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
|
||||||
|
&& name[0] != '+' && name[0] != ',')
|
||||||
|
++name;
|
||||||
|
|
||||||
|
return (char *) name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
_nl_explode_name (name, language, modifier, territory, codeset,
|
||||||
|
normalized_codeset, special, sponsor, revision)
|
||||||
|
char *name;
|
||||||
|
const char **language;
|
||||||
|
const char **modifier;
|
||||||
|
const char **territory;
|
||||||
|
const char **codeset;
|
||||||
|
const char **normalized_codeset;
|
||||||
|
const char **special;
|
||||||
|
const char **sponsor;
|
||||||
|
const char **revision;
|
||||||
|
{
|
||||||
|
enum { undecided, xpg, cen } syntax;
|
||||||
|
char *cp;
|
||||||
|
int mask;
|
||||||
|
|
||||||
|
*modifier = NULL;
|
||||||
|
*territory = NULL;
|
||||||
|
*codeset = NULL;
|
||||||
|
*normalized_codeset = NULL;
|
||||||
|
*special = NULL;
|
||||||
|
*sponsor = NULL;
|
||||||
|
*revision = NULL;
|
||||||
|
|
||||||
|
/* Now we determine the single parts of the locale name. First
|
||||||
|
look for the language. Termination symbols are `_' and `@' if
|
||||||
|
we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
|
||||||
|
mask = 0;
|
||||||
|
syntax = undecided;
|
||||||
|
*language = cp = name;
|
||||||
|
cp = _nl_find_language (*language);
|
||||||
|
|
||||||
|
if (*language == cp)
|
||||||
|
/* This does not make sense: language has to be specified. Use
|
||||||
|
this entry as it is without exploding. Perhaps it is an alias. */
|
||||||
|
cp = strchr (*language, '\0');
|
||||||
|
else if (cp[0] == '_')
|
||||||
|
{
|
||||||
|
/* Next is the territory. */
|
||||||
|
cp[0] = '\0';
|
||||||
|
*territory = ++cp;
|
||||||
|
|
||||||
|
while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
|
||||||
|
&& cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= TERRITORY;
|
||||||
|
|
||||||
|
if (cp[0] == '.')
|
||||||
|
{
|
||||||
|
/* Next is the codeset. */
|
||||||
|
syntax = xpg;
|
||||||
|
cp[0] = '\0';
|
||||||
|
*codeset = ++cp;
|
||||||
|
|
||||||
|
while (cp[0] != '\0' && cp[0] != '@')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= XPG_CODESET;
|
||||||
|
|
||||||
|
if (*codeset != cp && (*codeset)[0] != '\0')
|
||||||
|
{
|
||||||
|
*normalized_codeset = _nl_normalize_codeset (*codeset,
|
||||||
|
cp - *codeset);
|
||||||
|
if (strcmp (*codeset, *normalized_codeset) == 0)
|
||||||
|
free ((char *) *normalized_codeset);
|
||||||
|
else
|
||||||
|
mask |= XPG_NORM_CODESET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
|
||||||
|
{
|
||||||
|
/* Next is the modifier. */
|
||||||
|
syntax = cp[0] == '@' ? xpg : cen;
|
||||||
|
cp[0] = '\0';
|
||||||
|
*modifier = ++cp;
|
||||||
|
|
||||||
|
while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
|
||||||
|
&& cp[0] != ',' && cp[0] != '_')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= XPG_MODIFIER | CEN_AUDIENCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
|
||||||
|
{
|
||||||
|
syntax = cen;
|
||||||
|
|
||||||
|
if (cp[0] == '+')
|
||||||
|
{
|
||||||
|
/* Next is special application (CEN syntax). */
|
||||||
|
cp[0] = '\0';
|
||||||
|
*special = ++cp;
|
||||||
|
|
||||||
|
while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= CEN_SPECIAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cp[0] == ',')
|
||||||
|
{
|
||||||
|
/* Next is sponsor (CEN syntax). */
|
||||||
|
cp[0] = '\0';
|
||||||
|
*sponsor = ++cp;
|
||||||
|
|
||||||
|
while (cp[0] != '\0' && cp[0] != '_')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= CEN_SPONSOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cp[0] == '_')
|
||||||
|
{
|
||||||
|
/* Next is revision (CEN syntax). */
|
||||||
|
cp[0] = '\0';
|
||||||
|
*revision = ++cp;
|
||||||
|
|
||||||
|
mask |= CEN_REVISION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For CEN syntax values it might be important to have the
|
||||||
|
separator character in the file name, not for XPG syntax. */
|
||||||
|
if (syntax == xpg)
|
||||||
|
{
|
||||||
|
if (*territory != NULL && (*territory)[0] == '\0')
|
||||||
|
mask &= ~TERRITORY;
|
||||||
|
|
||||||
|
if (*codeset != NULL && (*codeset)[0] == '\0')
|
||||||
|
mask &= ~XPG_CODESET;
|
||||||
|
|
||||||
|
if (*modifier != NULL && (*modifier)[0] == '\0')
|
||||||
|
mask &= ~XPG_MODIFIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
216
intl/finddomain.c
Normal file
216
intl/finddomain.c
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
/* Handle list of needed message catalogs
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
void free ();
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
# ifndef memcpy
|
||||||
|
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !HAVE_STRCHR && !defined _LIBC
|
||||||
|
# ifndef strchr
|
||||||
|
# define strchr index
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_UNISTD_H || defined _LIBC
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "gettextP.h"
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
/* List of already loaded domains. */
|
||||||
|
static struct loaded_l10nfile *_nl_loaded_domains;
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a data structure describing the message catalog described by
|
||||||
|
the DOMAINNAME and CATEGORY parameters with respect to the currently
|
||||||
|
established bindings. */
|
||||||
|
struct loaded_l10nfile *
|
||||||
|
internal_function
|
||||||
|
_nl_find_domain (dirname, locale, domainname)
|
||||||
|
const char *dirname;
|
||||||
|
char *locale;
|
||||||
|
const char *domainname;
|
||||||
|
{
|
||||||
|
struct loaded_l10nfile *retval;
|
||||||
|
const char *language;
|
||||||
|
const char *modifier;
|
||||||
|
const char *territory;
|
||||||
|
const char *codeset;
|
||||||
|
const char *normalized_codeset;
|
||||||
|
const char *special;
|
||||||
|
const char *sponsor;
|
||||||
|
const char *revision;
|
||||||
|
const char *alias_value;
|
||||||
|
int mask;
|
||||||
|
|
||||||
|
/* LOCALE can consist of up to four recognized parts for the XPG syntax:
|
||||||
|
|
||||||
|
language[_territory[.codeset]][@modifier]
|
||||||
|
|
||||||
|
and six parts for the CEN syntax:
|
||||||
|
|
||||||
|
language[_territory][+audience][+special][,[sponsor][_revision]]
|
||||||
|
|
||||||
|
Beside the first part all of them are allowed to be missing. If
|
||||||
|
the full specified locale is not found, the less specific one are
|
||||||
|
looked for. The various parts will be stripped off according to
|
||||||
|
the following order:
|
||||||
|
(1) revision
|
||||||
|
(2) sponsor
|
||||||
|
(3) special
|
||||||
|
(4) codeset
|
||||||
|
(5) normalized codeset
|
||||||
|
(6) territory
|
||||||
|
(7) audience/modifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* If we have already tested for this locale entry there has to
|
||||||
|
be one data set in the list of loaded domains. */
|
||||||
|
retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
|
||||||
|
strlen (dirname) + 1, 0, locale, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, domainname, 0);
|
||||||
|
if (retval != NULL)
|
||||||
|
{
|
||||||
|
/* We know something about this locale. */
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
if (retval->decided == 0)
|
||||||
|
_nl_load_domain (retval);
|
||||||
|
|
||||||
|
if (retval->data != NULL)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
|
||||||
|
{
|
||||||
|
if (retval->successor[cnt]->decided == 0)
|
||||||
|
_nl_load_domain (retval->successor[cnt]);
|
||||||
|
|
||||||
|
if (retval->successor[cnt]->data != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return cnt >= 0 ? retval : NULL;
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See whether the locale value is an alias. If yes its value
|
||||||
|
*overwrites* the alias name. No test for the original value is
|
||||||
|
done. */
|
||||||
|
alias_value = _nl_expand_alias (locale);
|
||||||
|
if (alias_value != NULL)
|
||||||
|
{
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
locale = strdup (alias_value);
|
||||||
|
if (locale == NULL)
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
size_t len = strlen (alias_value) + 1;
|
||||||
|
locale = (char *) malloc (len);
|
||||||
|
if (locale == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memcpy (locale, alias_value, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now we determine the single parts of the locale name. First
|
||||||
|
look for the language. Termination symbols are `_' and `@' if
|
||||||
|
we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
|
||||||
|
mask = _nl_explode_name (locale, &language, &modifier, &territory,
|
||||||
|
&codeset, &normalized_codeset, &special,
|
||||||
|
&sponsor, &revision);
|
||||||
|
|
||||||
|
/* Create all possible locale entries which might be interested in
|
||||||
|
generalization. */
|
||||||
|
retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
|
||||||
|
strlen (dirname) + 1, mask, language, territory,
|
||||||
|
codeset, normalized_codeset, modifier, special,
|
||||||
|
sponsor, revision, domainname, 1);
|
||||||
|
if (retval == NULL)
|
||||||
|
/* This means we are out of core. */
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (retval->decided == 0)
|
||||||
|
_nl_load_domain (retval);
|
||||||
|
if (retval->data == NULL)
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
|
||||||
|
{
|
||||||
|
if (retval->successor[cnt]->decided == 0)
|
||||||
|
_nl_load_domain (retval->successor[cnt]);
|
||||||
|
if (retval->successor[cnt]->data != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The room for an alias was dynamically allocated. Free it now. */
|
||||||
|
if (alias_value != NULL)
|
||||||
|
free (locale);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
static void __attribute__ ((unused))
|
||||||
|
free_mem (void)
|
||||||
|
{
|
||||||
|
struct loaded_l10nfile *runp = _nl_loaded_domains;
|
||||||
|
|
||||||
|
while (runp != NULL)
|
||||||
|
{
|
||||||
|
struct loaded_l10nfile *here = runp;
|
||||||
|
if (runp->data != NULL)
|
||||||
|
_nl_unload_domain ((struct loaded_domain *) runp->data);
|
||||||
|
runp = runp->next;
|
||||||
|
free (here);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
text_set_element (__libc_subfreeres, free_mem);
|
||||||
|
#endif
|
||||||
70
intl/gettext.c
Normal file
70
intl/gettext.c
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/* Implementation of gettext(3) function.
|
||||||
|
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define __need_NULL
|
||||||
|
# include <stddef.h>
|
||||||
|
#else
|
||||||
|
# ifdef STDC_HEADERS
|
||||||
|
# include <stdlib.h> /* Just for NULL. */
|
||||||
|
# else
|
||||||
|
# ifdef HAVE_STRING_H
|
||||||
|
# include <string.h>
|
||||||
|
# else
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define GETTEXT __gettext
|
||||||
|
# define DGETTEXT __dgettext
|
||||||
|
#else
|
||||||
|
# define GETTEXT gettext__
|
||||||
|
# define DGETTEXT dgettext__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
|
text). */
|
||||||
|
char *
|
||||||
|
GETTEXT (msgid)
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
return DGETTEXT (NULL, msgid);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__gettext, gettext);
|
||||||
|
#endif
|
||||||
105
intl/gettext.h
Normal file
105
intl/gettext.h
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/* Internal header for GNU gettext internationalization functions.
|
||||||
|
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifndef _GETTEXT_H
|
||||||
|
#define _GETTEXT_H 1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if HAVE_LIMITS_H || _LIBC
|
||||||
|
# include <limits.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* The magic number of the GNU message catalog format. */
|
||||||
|
#define _MAGIC 0x950412de
|
||||||
|
#define _MAGIC_SWAPPED 0xde120495
|
||||||
|
|
||||||
|
/* Revision number of the currently used .mo (binary) file format. */
|
||||||
|
#define MO_REVISION_NUMBER 0
|
||||||
|
|
||||||
|
/* The following contortions are an attempt to use the C preprocessor
|
||||||
|
to determine an unsigned integral type that is 32 bits wide. An
|
||||||
|
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
|
||||||
|
doing that would require that the configure script compile and *run*
|
||||||
|
the resulting executable. Locally running cross-compiled executables
|
||||||
|
is usually not possible. */
|
||||||
|
|
||||||
|
#if __STDC__
|
||||||
|
# define UINT_MAX_32_BITS 4294967295U
|
||||||
|
#else
|
||||||
|
# define UINT_MAX_32_BITS 0xFFFFFFFF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If UINT_MAX isn't defined, assume it's a 32-bit type.
|
||||||
|
This should be valid for all systems GNU cares about because
|
||||||
|
that doesn't include 16-bit systems, and only modern systems
|
||||||
|
(that certainly have <limits.h>) have 64+-bit integral types. */
|
||||||
|
|
||||||
|
#ifndef UINT_MAX
|
||||||
|
# define UINT_MAX UINT_MAX_32_BITS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UINT_MAX == UINT_MAX_32_BITS
|
||||||
|
typedef unsigned nls_uint32;
|
||||||
|
#else
|
||||||
|
# if USHRT_MAX == UINT_MAX_32_BITS
|
||||||
|
typedef unsigned short nls_uint32;
|
||||||
|
# else
|
||||||
|
# if ULONG_MAX == UINT_MAX_32_BITS
|
||||||
|
typedef unsigned long nls_uint32;
|
||||||
|
# else
|
||||||
|
/* The following line is intended to throw an error. Using #error is
|
||||||
|
not portable enough. */
|
||||||
|
"Cannot determine unsigned 32-bit data type."
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Header for binary .mo file format. */
|
||||||
|
struct mo_file_header
|
||||||
|
{
|
||||||
|
/* The magic number. */
|
||||||
|
nls_uint32 magic;
|
||||||
|
/* The revision number of the file format. */
|
||||||
|
nls_uint32 revision;
|
||||||
|
/* The number of strings pairs. */
|
||||||
|
nls_uint32 nstrings;
|
||||||
|
/* Offset of table with start offsets of original strings. */
|
||||||
|
nls_uint32 orig_tab_offset;
|
||||||
|
/* Offset of table with start offsets of translation strings. */
|
||||||
|
nls_uint32 trans_tab_offset;
|
||||||
|
/* Size of hashing table. */
|
||||||
|
nls_uint32 hash_tab_size;
|
||||||
|
/* Offset of first hashing entry. */
|
||||||
|
nls_uint32 hash_tab_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct string_desc
|
||||||
|
{
|
||||||
|
/* Length of addressed string. */
|
||||||
|
nls_uint32 length;
|
||||||
|
/* Offset of string in file. */
|
||||||
|
nls_uint32 offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
#endif /* gettext.h */
|
||||||
89
intl/gettextP.h
Normal file
89
intl/gettextP.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* Header describing internals of gettext library
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifndef _GETTEXTP_H
|
||||||
|
#define _GETTEXTP_H
|
||||||
|
|
||||||
|
#include "loadinfo.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifndef PARAMS
|
||||||
|
# if __STDC__
|
||||||
|
# define PARAMS(args) args
|
||||||
|
# else
|
||||||
|
# define PARAMS(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef internal_function
|
||||||
|
# define internal_function
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef W
|
||||||
|
# define W(flag, data) ((flag) ? SWAP (data) : (data))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <byteswap.h>
|
||||||
|
# define SWAP(i) bswap_32 (i)
|
||||||
|
#else
|
||||||
|
static nls_uint32 SWAP PARAMS ((nls_uint32 i));
|
||||||
|
|
||||||
|
static inline nls_uint32
|
||||||
|
SWAP (i)
|
||||||
|
nls_uint32 i;
|
||||||
|
{
|
||||||
|
return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
struct loaded_domain
|
||||||
|
{
|
||||||
|
const char *data;
|
||||||
|
int use_mmap;
|
||||||
|
size_t mmap_size;
|
||||||
|
int must_swap;
|
||||||
|
nls_uint32 nstrings;
|
||||||
|
struct string_desc *orig_tab;
|
||||||
|
struct string_desc *trans_tab;
|
||||||
|
nls_uint32 hash_size;
|
||||||
|
nls_uint32 *hash_tab;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct binding
|
||||||
|
{
|
||||||
|
struct binding *next;
|
||||||
|
char *domainname;
|
||||||
|
char *dirname;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
|
||||||
|
char *__locale,
|
||||||
|
const char *__domainname))
|
||||||
|
internal_function;
|
||||||
|
void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain))
|
||||||
|
internal_function;
|
||||||
|
void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
|
||||||
|
internal_function;
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
#endif /* gettextP.h */
|
||||||
59
intl/hash-string.h
Normal file
59
intl/hash-string.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/* Implements a string hashing function.
|
||||||
|
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifndef PARAMS
|
||||||
|
# if __STDC__
|
||||||
|
# define PARAMS(Args) Args
|
||||||
|
# else
|
||||||
|
# define PARAMS(Args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* We assume to have `unsigned long int' value with at least 32 bits. */
|
||||||
|
#define HASHWORDBITS 32
|
||||||
|
|
||||||
|
|
||||||
|
/* Defines the so called `hashpjw' function by P.J. Weinberger
|
||||||
|
[see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
|
||||||
|
1986, 1987 Bell Telephone Laboratories, Inc.] */
|
||||||
|
static unsigned long int hash_string PARAMS ((const char *__str_param));
|
||||||
|
|
||||||
|
static inline unsigned long int
|
||||||
|
hash_string (str_param)
|
||||||
|
const char *str_param;
|
||||||
|
{
|
||||||
|
unsigned long int hval, g;
|
||||||
|
const char *str = str_param;
|
||||||
|
|
||||||
|
/* Compute the hash value for the given string. */
|
||||||
|
hval = 0;
|
||||||
|
while (*str != '\0')
|
||||||
|
{
|
||||||
|
hval <<= 4;
|
||||||
|
hval += (unsigned long int) *str++;
|
||||||
|
g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
|
||||||
|
if (g != 0)
|
||||||
|
{
|
||||||
|
hval ^= g >> (HASHWORDBITS - 8);
|
||||||
|
hval ^= g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hval;
|
||||||
|
}
|
||||||
76
intl/intl-compat.c
Normal file
76
intl/intl-compat.c
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
|
||||||
|
Library.
|
||||||
|
Copyright (C) 1995 Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libgettext.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
|
||||||
|
#undef gettext
|
||||||
|
#undef dgettext
|
||||||
|
#undef dcgettext
|
||||||
|
#undef textdomain
|
||||||
|
#undef bindtextdomain
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
bindtextdomain (domainname, dirname)
|
||||||
|
const char *domainname;
|
||||||
|
const char *dirname;
|
||||||
|
{
|
||||||
|
return bindtextdomain__ (domainname, dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
dcgettext (domainname, msgid, category)
|
||||||
|
const char *domainname;
|
||||||
|
const char *msgid;
|
||||||
|
int category;
|
||||||
|
{
|
||||||
|
return dcgettext__ (domainname, msgid, category);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
dgettext (domainname, msgid)
|
||||||
|
const char *domainname;
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
return dgettext__ (domainname, msgid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
gettext (msgid)
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
return gettext__ (msgid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
textdomain (domainname)
|
||||||
|
const char *domainname;
|
||||||
|
{
|
||||||
|
return textdomain__ (domainname);
|
||||||
|
}
|
||||||
411
intl/l10nflist.c
Normal file
411
intl/l10nflist.c
Normal file
@@ -0,0 +1,411 @@
|
|||||||
|
/* Handle list of needed message catalogs
|
||||||
|
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE 1
|
||||||
|
# endif
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
# ifndef memcpy
|
||||||
|
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !HAVE_STRCHR && !defined _LIBC
|
||||||
|
# ifndef strchr
|
||||||
|
# define strchr index
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _LIBC || defined HAVE_ARGZ_H
|
||||||
|
# include <argz.h>
|
||||||
|
#endif
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "loadinfo.h"
|
||||||
|
|
||||||
|
/* On some strange systems still no definition of NULL is found. Sigh! */
|
||||||
|
#ifndef NULL
|
||||||
|
# if defined __STDC__ && __STDC__
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# else
|
||||||
|
# define NULL 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Rename the non ANSI C functions. This is required by the standard
|
||||||
|
because some ANSI C functions will require linking with this object
|
||||||
|
file and the name space must not be polluted. */
|
||||||
|
# ifndef stpcpy
|
||||||
|
# define stpcpy(dest, src) __stpcpy(dest, src)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifndef HAVE_STPCPY
|
||||||
|
static char *stpcpy PARAMS ((char *dest, const char *src));
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define function which are usually not available. */
|
||||||
|
|
||||||
|
#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
|
||||||
|
/* Returns the number of strings in ARGZ. */
|
||||||
|
static size_t argz_count__ PARAMS ((const char *argz, size_t len));
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
argz_count__ (argz, len)
|
||||||
|
const char *argz;
|
||||||
|
size_t len;
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
size_t part_len = strlen (argz);
|
||||||
|
argz += part_len + 1;
|
||||||
|
len -= part_len + 1;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
# undef __argz_count
|
||||||
|
# define __argz_count(argz, len) argz_count__ (argz, len)
|
||||||
|
#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
|
||||||
|
|
||||||
|
#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
|
||||||
|
/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
|
||||||
|
except the last into the character SEP. */
|
||||||
|
static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
|
||||||
|
|
||||||
|
static void
|
||||||
|
argz_stringify__ (argz, len, sep)
|
||||||
|
char *argz;
|
||||||
|
size_t len;
|
||||||
|
int sep;
|
||||||
|
{
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
size_t part_len = strlen (argz);
|
||||||
|
argz += part_len;
|
||||||
|
len -= part_len + 1;
|
||||||
|
if (len > 0)
|
||||||
|
*argz++ = sep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# undef __argz_stringify
|
||||||
|
# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
|
||||||
|
#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
|
||||||
|
|
||||||
|
#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
|
||||||
|
static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
|
||||||
|
const char *entry));
|
||||||
|
|
||||||
|
static char *
|
||||||
|
argz_next__ (argz, argz_len, entry)
|
||||||
|
char *argz;
|
||||||
|
size_t argz_len;
|
||||||
|
const char *entry;
|
||||||
|
{
|
||||||
|
if (entry)
|
||||||
|
{
|
||||||
|
if (entry < argz + argz_len)
|
||||||
|
entry = strchr (entry, '\0') + 1;
|
||||||
|
|
||||||
|
return entry >= argz + argz_len ? NULL : (char *) entry;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (argz_len > 0)
|
||||||
|
return argz;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
# undef __argz_next
|
||||||
|
# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
|
||||||
|
#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
|
||||||
|
|
||||||
|
|
||||||
|
/* Return number of bits set in X. */
|
||||||
|
static int pop PARAMS ((int x));
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
pop (x)
|
||||||
|
int x;
|
||||||
|
{
|
||||||
|
/* We assume that no more than 16 bits are used. */
|
||||||
|
x = ((x & ~0x5555) >> 1) + (x & 0x5555);
|
||||||
|
x = ((x & ~0x3333) >> 2) + (x & 0x3333);
|
||||||
|
x = ((x >> 4) + x) & 0x0f0f;
|
||||||
|
x = ((x >> 8) + x) & 0xff;
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct loaded_l10nfile *
|
||||||
|
_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
||||||
|
territory, codeset, normalized_codeset, modifier, special,
|
||||||
|
sponsor, revision, filename, do_allocate)
|
||||||
|
struct loaded_l10nfile **l10nfile_list;
|
||||||
|
const char *dirlist;
|
||||||
|
size_t dirlist_len;
|
||||||
|
int mask;
|
||||||
|
const char *language;
|
||||||
|
const char *territory;
|
||||||
|
const char *codeset;
|
||||||
|
const char *normalized_codeset;
|
||||||
|
const char *modifier;
|
||||||
|
const char *special;
|
||||||
|
const char *sponsor;
|
||||||
|
const char *revision;
|
||||||
|
const char *filename;
|
||||||
|
int do_allocate;
|
||||||
|
{
|
||||||
|
char *abs_filename;
|
||||||
|
struct loaded_l10nfile *last = NULL;
|
||||||
|
struct loaded_l10nfile *retval;
|
||||||
|
char *cp;
|
||||||
|
size_t entries;
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
/* Allocate room for the full file name. */
|
||||||
|
abs_filename = (char *) malloc (dirlist_len
|
||||||
|
+ strlen (language)
|
||||||
|
+ ((mask & TERRITORY) != 0
|
||||||
|
? strlen (territory) + 1 : 0)
|
||||||
|
+ ((mask & XPG_CODESET) != 0
|
||||||
|
? strlen (codeset) + 1 : 0)
|
||||||
|
+ ((mask & XPG_NORM_CODESET) != 0
|
||||||
|
? strlen (normalized_codeset) + 1 : 0)
|
||||||
|
+ (((mask & XPG_MODIFIER) != 0
|
||||||
|
|| (mask & CEN_AUDIENCE) != 0)
|
||||||
|
? strlen (modifier) + 1 : 0)
|
||||||
|
+ ((mask & CEN_SPECIAL) != 0
|
||||||
|
? strlen (special) + 1 : 0)
|
||||||
|
+ (((mask & CEN_SPONSOR) != 0
|
||||||
|
|| (mask & CEN_REVISION) != 0)
|
||||||
|
? (1 + ((mask & CEN_SPONSOR) != 0
|
||||||
|
? strlen (sponsor) + 1 : 0)
|
||||||
|
+ ((mask & CEN_REVISION) != 0
|
||||||
|
? strlen (revision) + 1 : 0)) : 0)
|
||||||
|
+ 1 + strlen (filename) + 1);
|
||||||
|
|
||||||
|
if (abs_filename == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
retval = NULL;
|
||||||
|
last = NULL;
|
||||||
|
|
||||||
|
/* Construct file name. */
|
||||||
|
memcpy (abs_filename, dirlist, dirlist_len);
|
||||||
|
__argz_stringify (abs_filename, dirlist_len, ':');
|
||||||
|
cp = abs_filename + (dirlist_len - 1);
|
||||||
|
*cp++ = '/';
|
||||||
|
cp = stpcpy (cp, language);
|
||||||
|
|
||||||
|
if ((mask & TERRITORY) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '_';
|
||||||
|
cp = stpcpy (cp, territory);
|
||||||
|
}
|
||||||
|
if ((mask & XPG_CODESET) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '.';
|
||||||
|
cp = stpcpy (cp, codeset);
|
||||||
|
}
|
||||||
|
if ((mask & XPG_NORM_CODESET) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '.';
|
||||||
|
cp = stpcpy (cp, normalized_codeset);
|
||||||
|
}
|
||||||
|
if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
|
||||||
|
{
|
||||||
|
/* This component can be part of both syntaces but has different
|
||||||
|
leading characters. For CEN we use `+', else `@'. */
|
||||||
|
*cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
|
||||||
|
cp = stpcpy (cp, modifier);
|
||||||
|
}
|
||||||
|
if ((mask & CEN_SPECIAL) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '+';
|
||||||
|
cp = stpcpy (cp, special);
|
||||||
|
}
|
||||||
|
if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = ',';
|
||||||
|
if ((mask & CEN_SPONSOR) != 0)
|
||||||
|
cp = stpcpy (cp, sponsor);
|
||||||
|
if ((mask & CEN_REVISION) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '_';
|
||||||
|
cp = stpcpy (cp, revision);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*cp++ = '/';
|
||||||
|
stpcpy (cp, filename);
|
||||||
|
|
||||||
|
/* Look in list of already loaded domains whether it is already
|
||||||
|
available. */
|
||||||
|
last = NULL;
|
||||||
|
for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
|
||||||
|
if (retval->filename != NULL)
|
||||||
|
{
|
||||||
|
int compare = strcmp (retval->filename, abs_filename);
|
||||||
|
if (compare == 0)
|
||||||
|
/* We found it! */
|
||||||
|
break;
|
||||||
|
if (compare < 0)
|
||||||
|
{
|
||||||
|
/* It's not in the list. */
|
||||||
|
retval = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
last = retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retval != NULL || do_allocate == 0)
|
||||||
|
{
|
||||||
|
free (abs_filename);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = (struct loaded_l10nfile *)
|
||||||
|
malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len)
|
||||||
|
* (1 << pop (mask))
|
||||||
|
* sizeof (struct loaded_l10nfile *)));
|
||||||
|
if (retval == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
retval->filename = abs_filename;
|
||||||
|
retval->decided = (__argz_count (dirlist, dirlist_len) != 1
|
||||||
|
|| ((mask & XPG_CODESET) != 0
|
||||||
|
&& (mask & XPG_NORM_CODESET) != 0));
|
||||||
|
retval->data = NULL;
|
||||||
|
|
||||||
|
if (last == NULL)
|
||||||
|
{
|
||||||
|
retval->next = *l10nfile_list;
|
||||||
|
*l10nfile_list = retval;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retval->next = last->next;
|
||||||
|
last->next = retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
entries = 0;
|
||||||
|
/* If the DIRLIST is a real list the RETVAL entry corresponds not to
|
||||||
|
a real file. So we have to use the DIRLIST separation mechanism
|
||||||
|
of the inner loop. */
|
||||||
|
cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask;
|
||||||
|
for (; cnt >= 0; --cnt)
|
||||||
|
if ((cnt & ~mask) == 0
|
||||||
|
&& ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
|
||||||
|
&& ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
|
||||||
|
{
|
||||||
|
/* Iterate over all elements of the DIRLIST. */
|
||||||
|
char *dir = NULL;
|
||||||
|
|
||||||
|
while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
|
||||||
|
!= NULL)
|
||||||
|
retval->successor[entries++]
|
||||||
|
= _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
|
||||||
|
language, territory, codeset,
|
||||||
|
normalized_codeset, modifier, special,
|
||||||
|
sponsor, revision, filename, 1);
|
||||||
|
}
|
||||||
|
retval->successor[entries] = NULL;
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Normalize codeset name. There is no standard for the codeset
|
||||||
|
names. Normalization allows the user to use any of the common
|
||||||
|
names. */
|
||||||
|
const char *
|
||||||
|
_nl_normalize_codeset (codeset, name_len)
|
||||||
|
const char *codeset;
|
||||||
|
size_t name_len;
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
int only_digit = 1;
|
||||||
|
char *retval;
|
||||||
|
char *wp;
|
||||||
|
size_t cnt;
|
||||||
|
|
||||||
|
for (cnt = 0; cnt < name_len; ++cnt)
|
||||||
|
if (isalnum (codeset[cnt]))
|
||||||
|
{
|
||||||
|
++len;
|
||||||
|
|
||||||
|
if (isalpha (codeset[cnt]))
|
||||||
|
only_digit = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
|
||||||
|
|
||||||
|
if (retval != NULL)
|
||||||
|
{
|
||||||
|
if (only_digit)
|
||||||
|
wp = stpcpy (retval, "iso");
|
||||||
|
else
|
||||||
|
wp = retval;
|
||||||
|
|
||||||
|
for (cnt = 0; cnt < name_len; ++cnt)
|
||||||
|
if (isalpha (codeset[cnt]))
|
||||||
|
*wp++ = tolower (codeset[cnt]);
|
||||||
|
else if (isdigit (codeset[cnt]))
|
||||||
|
*wp++ = codeset[cnt];
|
||||||
|
|
||||||
|
*wp = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return (const char *) retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
/* We don't want libintl.a to depend on any other library. So we
|
||||||
|
avoid the non-standard function stpcpy. In GNU C Library this
|
||||||
|
function is available, though. Also allow the symbol HAVE_STPCPY
|
||||||
|
to be defined. */
|
||||||
|
#if !_LIBC && !HAVE_STPCPY
|
||||||
|
static char *
|
||||||
|
stpcpy (dest, src)
|
||||||
|
char *dest;
|
||||||
|
const char *src;
|
||||||
|
{
|
||||||
|
while ((*dest++ = *src++) != '\0')
|
||||||
|
/* Do nothing. */ ;
|
||||||
|
return dest - 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
182
intl/libgettext.h
Normal file
182
intl/libgettext.h
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
/* Message catalogs for internationalization.
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* Because on some systems (e.g. Solaris) we sometimes have to include
|
||||||
|
the systems libintl.h as well as this file we have more complex
|
||||||
|
include protection above. But the systems header might perhaps also
|
||||||
|
define _LIBINTL_H and therefore we have to protect the definition here. */
|
||||||
|
|
||||||
|
#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H
|
||||||
|
#ifndef _LIBINTL_H
|
||||||
|
# define _LIBINTL_H 1
|
||||||
|
#endif
|
||||||
|
#define _LIBGETTEXT_H 1
|
||||||
|
|
||||||
|
/* We define an additional symbol to signal that we use the GNU
|
||||||
|
implementation of gettext. */
|
||||||
|
#define __USE_GNU_GETTEXT 1
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if HAVE_LOCALE_H
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifndef PARAMS
|
||||||
|
# if __STDC__ || defined __cplusplus
|
||||||
|
# define PARAMS(args) args
|
||||||
|
# else
|
||||||
|
# define PARAMS(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
# if !defined __cplusplus || defined __GNUC__
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# else
|
||||||
|
# define NULL (0)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !HAVE_LC_MESSAGES
|
||||||
|
/* This value determines the behaviour of the gettext() and dgettext()
|
||||||
|
function. But some system does not have this defined. Define it
|
||||||
|
to a default value. */
|
||||||
|
# define LC_MESSAGES (-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Declarations for gettext-using-catgets interface. Derived from
|
||||||
|
Jim Meyering's libintl.h. */
|
||||||
|
struct _msg_ent
|
||||||
|
{
|
||||||
|
const char *_msg;
|
||||||
|
int _msg_number;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if HAVE_CATGETS
|
||||||
|
/* These two variables are defined in the automatically by po-to-tbl.sed
|
||||||
|
generated file `cat-id-tbl.c'. */
|
||||||
|
extern const struct _msg_ent _msg_tbl[];
|
||||||
|
extern int _msg_tbl_length;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* For automatical extraction of messages sometimes no real
|
||||||
|
translation is needed. Instead the string itself is the result. */
|
||||||
|
#define gettext_noop(Str) (Str)
|
||||||
|
|
||||||
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
|
text). */
|
||||||
|
extern char *gettext PARAMS ((const char *__msgid));
|
||||||
|
extern char *gettext__ PARAMS ((const char *__msgid));
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current
|
||||||
|
LC_MESSAGES locale. */
|
||||||
|
extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
|
||||||
|
extern char *dgettext__ PARAMS ((const char *__domainname,
|
||||||
|
const char *__msgid));
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
|
locale. */
|
||||||
|
extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
|
||||||
|
int __category));
|
||||||
|
extern char *dcgettext__ PARAMS ((const char *__domainname,
|
||||||
|
const char *__msgid, int __category));
|
||||||
|
|
||||||
|
|
||||||
|
/* Set the current default message catalog to DOMAINNAME.
|
||||||
|
If DOMAINNAME is null, return the current default.
|
||||||
|
If DOMAINNAME is "", reset to the default of "messages". */
|
||||||
|
extern char *textdomain PARAMS ((const char *__domainname));
|
||||||
|
extern char *textdomain__ PARAMS ((const char *__domainname));
|
||||||
|
|
||||||
|
/* Specify that the DOMAINNAME message catalog will be found
|
||||||
|
in DIRNAME rather than in the system locale data base. */
|
||||||
|
extern char *bindtextdomain PARAMS ((const char *__domainname,
|
||||||
|
const char *__dirname));
|
||||||
|
extern char *bindtextdomain__ PARAMS ((const char *__domainname,
|
||||||
|
const char *__dirname));
|
||||||
|
|
||||||
|
#if ENABLE_NLS
|
||||||
|
|
||||||
|
/* Solaris 2.3 has the gettext function but dcgettext is missing.
|
||||||
|
So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4
|
||||||
|
has dcgettext. */
|
||||||
|
# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT)
|
||||||
|
|
||||||
|
# define gettext(Msgid) \
|
||||||
|
dgettext (NULL, Msgid)
|
||||||
|
|
||||||
|
# define dgettext(Domainname, Msgid) \
|
||||||
|
dcgettext (Domainname, Msgid, LC_MESSAGES)
|
||||||
|
|
||||||
|
# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7
|
||||||
|
/* This global variable is defined in loadmsgcat.c. We need a sign,
|
||||||
|
whether a new catalog was loaded, which can be associated with all
|
||||||
|
translations. */
|
||||||
|
extern int _nl_msg_cat_cntr;
|
||||||
|
|
||||||
|
# define dcgettext(Domainname, Msgid, Category) \
|
||||||
|
(__extension__ \
|
||||||
|
({ \
|
||||||
|
char *__result; \
|
||||||
|
if (__builtin_constant_p (Msgid)) \
|
||||||
|
{ \
|
||||||
|
static char *__translation__; \
|
||||||
|
static int __catalog_counter__; \
|
||||||
|
if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \
|
||||||
|
{ \
|
||||||
|
__translation__ = \
|
||||||
|
dcgettext__ (Domainname, Msgid, Category); \
|
||||||
|
__catalog_counter__ = _nl_msg_cat_cntr; \
|
||||||
|
} \
|
||||||
|
__result = __translation__; \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
__result = dcgettext__ (Domainname, Msgid, Category); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# define gettext(Msgid) (Msgid)
|
||||||
|
# define dgettext(Domainname, Msgid) (Msgid)
|
||||||
|
# define dcgettext(Domainname, Msgid, Category) (Msgid)
|
||||||
|
# define textdomain(Domainname) ((char *) Domainname)
|
||||||
|
# define bindtextdomain(Domainname, Dirname) ((char *) Dirname)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
100
intl/linux-msg.sed
Normal file
100
intl/linux-msg.sed
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file
|
||||||
|
# Copyright (C) 1995 Free Software Foundation, Inc.
|
||||||
|
# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# The first directive in the .msg should be the definition of the
|
||||||
|
# message set number. We use always set number 1.
|
||||||
|
#
|
||||||
|
1 {
|
||||||
|
i\
|
||||||
|
$set 1 # Automatically created by po2msg.sed
|
||||||
|
h
|
||||||
|
s/.*/0/
|
||||||
|
x
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# Mitch's old catalog format does not allow comments.
|
||||||
|
#
|
||||||
|
# We copy the original message as a comment into the .msg file.
|
||||||
|
#
|
||||||
|
/^msgid/ {
|
||||||
|
s/msgid[ ]*"//
|
||||||
|
#
|
||||||
|
# This does not work now with the new format.
|
||||||
|
# /"$/! {
|
||||||
|
# s/\\$//
|
||||||
|
# s/$/ ... (more lines following)"/
|
||||||
|
# }
|
||||||
|
x
|
||||||
|
# The following nice solution is by
|
||||||
|
# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
|
||||||
|
td
|
||||||
|
# Increment a decimal number in pattern space.
|
||||||
|
# First hide trailing `9' digits.
|
||||||
|
:d
|
||||||
|
s/9\(_*\)$/_\1/
|
||||||
|
td
|
||||||
|
# Assure at least one digit is available.
|
||||||
|
s/^\(_*\)$/0\1/
|
||||||
|
# Increment the last digit.
|
||||||
|
s/8\(_*\)$/9\1/
|
||||||
|
s/7\(_*\)$/8\1/
|
||||||
|
s/6\(_*\)$/7\1/
|
||||||
|
s/5\(_*\)$/6\1/
|
||||||
|
s/4\(_*\)$/5\1/
|
||||||
|
s/3\(_*\)$/4\1/
|
||||||
|
s/2\(_*\)$/3\1/
|
||||||
|
s/1\(_*\)$/2\1/
|
||||||
|
s/0\(_*\)$/1\1/
|
||||||
|
# Convert the hidden `9' digits to `0's.
|
||||||
|
s/_/0/g
|
||||||
|
x
|
||||||
|
G
|
||||||
|
s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# The .msg file contains, other then the .po file, only the translations
|
||||||
|
# but each given a unique ID. Starting from 1 and incrementing by 1 for
|
||||||
|
# each message we assign them to the messages.
|
||||||
|
# It is important that the .po file used to generate the cat-id-tbl.c file
|
||||||
|
# (with po-to-tbl) is the same as the one used here. (At least the order
|
||||||
|
# of declarations must not be changed.)
|
||||||
|
#
|
||||||
|
/^msgstr/ {
|
||||||
|
s/msgstr[ ]*"\(.*\)"/# \1/
|
||||||
|
# Clear substitution flag.
|
||||||
|
tb
|
||||||
|
# Append the next line.
|
||||||
|
:b
|
||||||
|
N
|
||||||
|
# Look whether second part is continuation line.
|
||||||
|
s/\(.*\n\)"\(.*\)"/\1\2/
|
||||||
|
# Yes, then branch.
|
||||||
|
ta
|
||||||
|
P
|
||||||
|
D
|
||||||
|
# Note that D includes a jump to the start!!
|
||||||
|
# We found a continuation line. But before printing insert '\'.
|
||||||
|
:a
|
||||||
|
s/\(.*\)\(\n.*\)/\1\\\2/
|
||||||
|
P
|
||||||
|
# We cannot use D here.
|
||||||
|
s/.*\n\(.*\)/\1/
|
||||||
|
tb
|
||||||
|
}
|
||||||
|
d
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user