Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 22656c36a2 | |||
| 11071522a2 | |||
| 909036d714 | |||
| de50b39475 | |||
| b5c99ec30e | |||
| 58b96645c9 | |||
| 817f3283d1 | |||
| 0e0bcacf3c | |||
| 0004cc46dd | |||
| 1c330177f0 |
@@ -0,0 +1,34 @@
|
|||||||
|
image: alpine/latest
|
||||||
|
# apk add --update alpine-sdk
|
||||||
|
packages:
|
||||||
|
- cmd:setcap
|
||||||
|
- autoconf
|
||||||
|
- automake
|
||||||
|
- byacc
|
||||||
|
- expect
|
||||||
|
- gettext
|
||||||
|
- gettext-dev
|
||||||
|
- gettext-lang
|
||||||
|
- libbsd-dev
|
||||||
|
- libcap-dev
|
||||||
|
- libtool
|
||||||
|
- linux-pam-dev
|
||||||
|
- pkgconf
|
||||||
|
- sed
|
||||||
|
sources:
|
||||||
|
- https://github.com/shadow-maint/shadow
|
||||||
|
tasks:
|
||||||
|
- build: |
|
||||||
|
cd shadow
|
||||||
|
./autogen.sh --without-selinux --disable-man --disable-nls
|
||||||
|
grep ENABLE_ config.status
|
||||||
|
- tasks: |
|
||||||
|
cd shadow
|
||||||
|
cat /proc/self/uid_map
|
||||||
|
cat /proc/self/status
|
||||||
|
make
|
||||||
|
make DESTDIR=/tmp/shadow-inst install
|
||||||
|
sudo make install
|
||||||
|
#TODO - fix up the tests. Let's merge what's here now as it
|
||||||
|
#at least tests build.
|
||||||
|
#(cd tests; sudo ./run_some || { cat testsuite.log; false; })
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
image: fedora/latest
|
||||||
|
packages:
|
||||||
|
- autoconf
|
||||||
|
- automake
|
||||||
|
- byacc
|
||||||
|
- expect
|
||||||
|
- findutils
|
||||||
|
- gettext
|
||||||
|
- gettext-devel
|
||||||
|
- git
|
||||||
|
- libbsd-devel
|
||||||
|
- libselinux-devel
|
||||||
|
- libsemanage-devel
|
||||||
|
- libtool
|
||||||
|
- libxslt
|
||||||
|
- pkgconf
|
||||||
|
sources:
|
||||||
|
- https://github.com/shadow-maint/shadow
|
||||||
|
tasks:
|
||||||
|
- build: |
|
||||||
|
cd shadow
|
||||||
|
./autogen.sh --with-selinux --enable-man
|
||||||
|
grep ENABLE_ config.status
|
||||||
|
- tasks: |
|
||||||
|
cd shadow
|
||||||
|
cat /proc/self/uid_map
|
||||||
|
cat /proc/self/status
|
||||||
|
make
|
||||||
|
make DESTDIR=/tmp/shadow-inst install
|
||||||
|
sudo make install
|
||||||
|
#TODO - fix up the tests. Let's merge what's here now as it
|
||||||
|
#at least tests build.
|
||||||
|
#(cd tests; sudo ./run_some || { cat testsuite.log; false; })
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
image: ubuntu/focal
|
||||||
|
packages:
|
||||||
|
- automake
|
||||||
|
- autopoint
|
||||||
|
- xsltproc
|
||||||
|
- libbsd-dev
|
||||||
|
- libselinux1-dev
|
||||||
|
- gettext
|
||||||
|
- expect
|
||||||
|
- byacc
|
||||||
|
- libtool
|
||||||
|
- pkgconf
|
||||||
|
sources:
|
||||||
|
- https://github.com/shadow-maint/shadow
|
||||||
|
tasks:
|
||||||
|
- build: |
|
||||||
|
cd shadow
|
||||||
|
./autogen.sh --without-selinux --disable-man
|
||||||
|
grep ENABLE_ config.status
|
||||||
|
- tasks: |
|
||||||
|
cd shadow
|
||||||
|
cat /proc/self/uid_map
|
||||||
|
cat /proc/self/status
|
||||||
|
systemd-detect-virt
|
||||||
|
make
|
||||||
|
make DESTDIR=/tmp/shadow-inst install
|
||||||
|
sudo make install
|
||||||
|
(cd tests; sudo ./run_some || { cat testsuite.log; false; })
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
image: ubuntu/22.04
|
||||||
|
packages:
|
||||||
|
- automake
|
||||||
|
- autopoint
|
||||||
|
- xsltproc
|
||||||
|
- libbsd-dev
|
||||||
|
- libselinux1-dev
|
||||||
|
- gettext
|
||||||
|
- expect
|
||||||
|
- byacc
|
||||||
|
- libtool
|
||||||
|
- pkgconf
|
||||||
|
sources:
|
||||||
|
- https://github.com/shadow-maint/shadow
|
||||||
|
tasks:
|
||||||
|
- build: |
|
||||||
|
cd shadow
|
||||||
|
./autogen.sh --without-selinux --enable-man
|
||||||
|
grep ENABLE_ config.status
|
||||||
|
- tasks: |
|
||||||
|
cat /proc/self/uid_map
|
||||||
|
cat /proc/self/status
|
||||||
|
systemd-detect-virt
|
||||||
|
cd shadow
|
||||||
|
make
|
||||||
|
make DESTDIR=/tmp/shadow-inst install
|
||||||
|
sudo make install
|
||||||
|
(cd tests; sudo ./run_some || { cat testsuite.log; false; })
|
||||||
@@ -5,21 +5,8 @@ runs:
|
|||||||
steps:
|
steps:
|
||||||
- shell: bash
|
- shell: bash
|
||||||
run: |
|
run: |
|
||||||
if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then
|
sudo apt-get update -y
|
||||||
echo "Found new-style sources.list.d"
|
sudo apt-get install -y ubuntu-dev-tools libbsd-dev
|
||||||
cat /etc/apt/sources.list.d/ubuntu.sources
|
sudo sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list
|
||||||
sudo sed -i 's/^Types: deb/Types: deb deb-src/' /etc/apt/sources.list.d/ubuntu.sources
|
sudo apt-get update -y
|
||||||
else
|
|
||||||
echo "Found legacy sources.list"
|
|
||||||
cat /etc/apt/sources.list
|
|
||||||
sudo sed -i '/deb-src/d' /etc/apt/sources.list
|
|
||||||
sudo sed -i '/^deb /p;s/ /-src /' /etc/apt/sources.list
|
|
||||||
fi
|
|
||||||
export DEBIAN_PRIORITY=critical
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
# let's try to work around upgrade breakage in a pkg we don't care about
|
|
||||||
sudo apt-mark hold grub-efi-amd64-bin grub-efi-amd64-signed
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y dist-upgrade
|
|
||||||
sudo apt-get -y install ubuntu-dev-tools automake autopoint xsltproc gettext expect byacc libtool libbsd-dev libltdl-dev pkgconf
|
|
||||||
sudo apt-get -y build-dep shadow
|
sudo apt-get -y build-dep shadow
|
||||||
|
|||||||
@@ -25,8 +25,18 @@ jobs:
|
|||||||
cat /proc/self/status
|
cat /proc/self/status
|
||||||
systemd-detect-virt
|
systemd-detect-virt
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
id: dependencies
|
run: |
|
||||||
uses: ./.github/actions/install-dependencies
|
sudo cat /etc/apt/sources.list
|
||||||
|
sudo sed -i '/deb-src/d' /etc/apt/sources.list
|
||||||
|
sudo sed -i '/^deb /p;s/ /-src /' /etc/apt/sources.list
|
||||||
|
export DEBIAN_PRIORITY=critical
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
# let's try to work around upgrade breakage in a pkg we don't care about
|
||||||
|
sudo apt-mark hold grub-efi-amd64-bin grub-efi-amd64-signed
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get -y dist-upgrade
|
||||||
|
sudo apt-get -y install ubuntu-dev-tools automake autopoint xsltproc gettext expect byacc libtool libbsd-dev pkgconf
|
||||||
|
sudo apt-get -y build-dep shadow
|
||||||
- name: configure
|
- name: configure
|
||||||
run: |
|
run: |
|
||||||
autoreconf -v -f --install
|
autoreconf -v -f --install
|
||||||
@@ -39,9 +49,8 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
cd tests
|
cd tests
|
||||||
trap 'cat testsuite.log' ERR
|
|
||||||
sudo ./run_some
|
sudo ./run_some
|
||||||
trap - ERR
|
cat testsuite.log
|
||||||
|
|
||||||
# Make sure that 'make dist' makes a usable tarball with no missing files
|
# Make sure that 'make dist' makes a usable tarball with no missing files
|
||||||
dist-build:
|
dist-build:
|
||||||
@@ -51,8 +60,18 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
id: dependencies
|
run: |
|
||||||
uses: ./.github/actions/install-dependencies
|
sudo cat /etc/apt/sources.list
|
||||||
|
sudo sed -i '/deb-src/d' /etc/apt/sources.list
|
||||||
|
sudo sed -i '/^deb /p;s/ /-src /' /etc/apt/sources.list
|
||||||
|
export DEBIAN_PRIORITY=critical
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
# let's try to work around upgrade breakage in a pkg we don't care about
|
||||||
|
sudo apt-mark hold grub-efi-amd64-bin grub-efi-amd64-signed
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get -y dist-upgrade
|
||||||
|
sudo apt-get -y install ubuntu-dev-tools automake autopoint xsltproc gettext expect byacc libtool libbsd-dev pkgconf
|
||||||
|
sudo apt-get -y build-dep shadow
|
||||||
|
|
||||||
- name: Test make dist
|
- name: Test make dist
|
||||||
run: |
|
run: |
|
||||||
@@ -64,12 +83,10 @@ jobs:
|
|||||||
cd $d
|
cd $d
|
||||||
./configure
|
./configure
|
||||||
make -j5
|
make -j5
|
||||||
make check
|
|
||||||
|
|
||||||
container-build:
|
container-build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
matrix:
|
||||||
os: [alpine, debian, fedora]
|
os: [alpine, debian, fedora]
|
||||||
|
|
||||||
@@ -77,25 +94,15 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install Ansible
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install ansible
|
|
||||||
|
|
||||||
- name: Build container
|
- name: Build container
|
||||||
run: |
|
run: |
|
||||||
pushd share/ansible/
|
docker buildx build -f ./share/containers/${{ matrix.os }}.dockerfile . --output build-out
|
||||||
ansible-playbook playbook.yml -i inventory.ini -e 'distribution=${{ matrix.os }}'
|
|
||||||
popd
|
|
||||||
|
|
||||||
- name: Store artifacts
|
- name: Store artifacts
|
||||||
if: always()
|
uses: actions/upload-artifact@v3
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.os }}-build
|
name: ${{ matrix.os }}-build
|
||||||
path: |
|
path: |
|
||||||
./share/ansible/build-out/config.log
|
./build-out/config.log
|
||||||
./share/ansible/build-out/config.h
|
./build-out/config.h
|
||||||
./share/ansible/build-out/build.log
|
|
||||||
./share/ansible/build-out/test-suite.log
|
|
||||||
if-no-files-found: ignore
|
if-no-files-found: ignore
|
||||||
|
|||||||
@@ -32,7 +32,10 @@ jobs:
|
|||||||
- name: Build shadow-utils
|
- name: Build shadow-utils
|
||||||
run: |
|
run: |
|
||||||
PROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN)
|
PROCESSORS=$(/usr/bin/getconf _NPROCESSORS_ONLN)
|
||||||
make -Orecurse -j$PROCESSORS
|
make -kj$PROCESSORS || true
|
||||||
|
|
||||||
|
- name: Check build errors
|
||||||
|
run: make
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v2
|
||||||
|
|||||||
@@ -3,11 +3,9 @@ lib*.a
|
|||||||
*.o
|
*.o
|
||||||
*.lo
|
*.lo
|
||||||
*.la
|
*.la
|
||||||
*.mo
|
|
||||||
*.gmo
|
*.gmo
|
||||||
.deps
|
.deps
|
||||||
.libs
|
.libs
|
||||||
.dirstamp
|
|
||||||
|
|
||||||
*.patch
|
*.patch
|
||||||
*.rej
|
*.rej
|
||||||
@@ -16,8 +14,6 @@ lib*.a
|
|||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
|
|
||||||
test-driver
|
|
||||||
|
|
||||||
/ABOUT-NLS
|
/ABOUT-NLS
|
||||||
/aclocal.m4
|
/aclocal.m4
|
||||||
/autom4te.cache
|
/autom4te.cache
|
||||||
@@ -38,7 +34,6 @@ test-driver
|
|||||||
/m4
|
/m4
|
||||||
/missing
|
/missing
|
||||||
/stamp-h1
|
/stamp-h1
|
||||||
/test-driver
|
|
||||||
/ylwrap
|
/ylwrap
|
||||||
|
|
||||||
/po/*.header
|
/po/*.header
|
||||||
|
|||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
dist: bionic
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
language: c
|
||||||
|
|
||||||
|
compiler:
|
||||||
|
- gcc
|
||||||
|
- clang
|
||||||
|
|
||||||
|
arch:
|
||||||
|
- amd64
|
||||||
|
- arm64
|
||||||
|
- ppc64le
|
||||||
|
- s390x
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- sudo apt-get update -qq
|
||||||
|
- sudo apt-get -y install -qq automake autopoint xsltproc libselinux1-dev gettext expect
|
||||||
|
- sudo apt-get -y install -qq byacc libtool
|
||||||
|
script:
|
||||||
|
- ./autogen.sh --without-selinux --disable-man
|
||||||
|
- grep ENABLE_ config.status
|
||||||
|
- make
|
||||||
|
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- secure: "G47VYFrtzqalrVjixTqBG9Qsa8EZRcaqsh1k6fq5JgEyHmMQActpvTUDs9FXf1MEqiY5XX3VDVfBsZgKPHgmHsMzD1bX11xpnpGByB8g7gr8I3u2ZkCREqgi77a5l3LeBh+seWiambe/DYOgvPCNa6pCynLgR9advqtgKhpCruU="
|
||||||
|
|
||||||
|
addons:
|
||||||
|
coverity_scan:
|
||||||
|
|
||||||
|
project:
|
||||||
|
name: "shadow-maint/shadow"
|
||||||
|
description: "Upstream shadow utils tree"
|
||||||
|
|
||||||
|
notification_email: christian.brauner@ubuntu.com,serge@hallyn.com
|
||||||
|
|
||||||
|
build_command_prepend: "./autogen.sh --without-selinux --disable-man"
|
||||||
|
build_command: "make -kj4 || make"
|
||||||
|
branch_pattern: master
|
||||||
|
|
||||||
|
script:
|
||||||
|
- cat /proc/self/uid_map
|
||||||
|
- cat /proc/self/status
|
||||||
|
- systemd-detect-virt
|
||||||
|
- ./autogen.sh --without-selinux --disable-man
|
||||||
|
- grep ENABLE_ config.status
|
||||||
|
- make
|
||||||
|
- sudo make install
|
||||||
|
- (cd tests; sudo ./run_some; cat testsuite.log)
|
||||||
|
|
||||||
|
# vim:et:ts=2:sw=2
|
||||||
@@ -9,14 +9,6 @@ a lot of mail...
|
|||||||
* Serge E. Hallyn <serge@hallyn.com> (2014-now)
|
* Serge E. Hallyn <serge@hallyn.com> (2014-now)
|
||||||
* Christian Brauner <christian@brauner.io> (2019-now)
|
* Christian Brauner <christian@brauner.io> (2019-now)
|
||||||
* Iker Pedrosa <ipedrosa@redhat.com> (2022-now)
|
* Iker Pedrosa <ipedrosa@redhat.com> (2022-now)
|
||||||
* Alejandro Colomar <alx@kernel.org> (2023-now) (4.14 stable)
|
|
||||||
|
|
||||||
To verify signatures on releases, use the following keys under keys/ :
|
|
||||||
|
|
||||||
* Serge Hallyn: keys/66D0387DB85D320F8408166DB175CFA98F192AF2.asc
|
|
||||||
* Christian Brauner: keys/4880B8C9BD0E5106FC070F4F7B3C391EFEA93624.asc
|
|
||||||
* Iker Pedrosa: keys/4E80EF49C7987B6DE2F81F5005079C6C3A653E57.asc
|
|
||||||
* Alejandro Colomar: keys/A9348594CE31283A826FBDD8D57633D441E25BB5.asc
|
|
||||||
|
|
||||||
# Authors and contributors
|
# Authors and contributors
|
||||||
* Adam Rudnicki <adam@v-lo.krakow.pl>
|
* Adam Rudnicki <adam@v-lo.krakow.pl>
|
||||||
|
|||||||
+3
-15
@@ -1,27 +1,15 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
EXTRA_DIST = NEWS README TODO shadow.spec.in
|
||||||
|
|
||||||
SUBDIRS = lib
|
SUBDIRS = lib
|
||||||
|
|
||||||
if ENABLE_SUBIDS
|
if ENABLE_SUBIDS
|
||||||
SUBDIRS += libsubid
|
SUBDIRS += libsubid
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SUBDIRS += src po contrib doc etc tests/unit
|
SUBDIRS += src po contrib doc etc
|
||||||
|
|
||||||
if ENABLE_REGENERATE_MAN
|
if ENABLE_REGENERATE_MAN
|
||||||
SUBDIRS += man
|
SUBDIRS += man
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CLEANFILES = man/8.out man/po/remove-potcdate.* man/*/login.defs.d man/*/*.mo
|
|
||||||
|
|
||||||
EXTRA_DIST = NEWS README tests/
|
|
||||||
|
|
||||||
dist-hook:
|
|
||||||
chmod -R u+w $(distdir)/tests
|
|
||||||
chmod u+w $(distdir)
|
|
||||||
mv $(distdir)/tests/unit $(distdir)/realunittest
|
|
||||||
mv $(distdir)/tests/tests $(distdir)/realtests
|
|
||||||
rm -rf $(distdir)/tests
|
|
||||||
mv $(distdir)/realtests $(distdir)/tests
|
|
||||||
rm -rf $(distdir)/tests/unit $(distdir)/tests/Makefile*
|
|
||||||
mv $(distdir)/realunittest $(distdir)/tests/unit
|
|
||||||
|
|||||||
@@ -17,12 +17,6 @@ are used for managing group accounts.
|
|||||||
* [Issue tracker](https://github.com/shadow-maint/shadow/issues)
|
* [Issue tracker](https://github.com/shadow-maint/shadow/issues)
|
||||||
* [Releases](https://github.com/shadow-maint/shadow/releases)
|
* [Releases](https://github.com/shadow-maint/shadow/releases)
|
||||||
|
|
||||||
## Code
|
|
||||||
|
|
||||||
The main development branch is at [https://github.com/shadow-maint/shadow.git](https://github.com/shadow-maint/shadow)
|
|
||||||
|
|
||||||
See [STABLE.md](https://github.com/shadow-maint/shadow/blob/master/STABLE.md) for a list of supported stable branches.
|
|
||||||
|
|
||||||
## Contacts
|
## Contacts
|
||||||
There are several ways to contact us:
|
There are several ways to contact us:
|
||||||
* [the general discussion mailing list](
|
* [the general discussion mailing list](
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
# Supported stable branches
|
|
||||||
|
|
||||||
The following stable branches are kindly maintained by trusted volunteers:
|
|
||||||
|
|
||||||
- 4.15.x
|
|
||||||
- git
|
|
||||||
- [main](https://www.alejandro-colomar.es/src/alx/shadow/stable/shadow.git/log/?h=4.15.x)
|
|
||||||
- [mirror](https://github.com/shadow-maint/shadow/tree/4.15.x)
|
|
||||||
- tarballs
|
|
||||||
- [main](https://www.alejandro-colomar.es/share/dist/shadow/4/4.15/)
|
|
||||||
- [mirror](https://github.com/shadow-maint/shadow/releases/)
|
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
* Create a common usage function that'd take the array of
|
||||||
|
long options and an array of descriptions and output that so things would
|
||||||
|
be standardized across the utils.
|
||||||
|
Usage strings should be normalized and split first.
|
||||||
|
Investigate optparse.
|
||||||
|
|
||||||
|
|
||||||
|
/etc/default/useradd
|
||||||
|
* GROUP=1000 should accept a group name.
|
||||||
|
|
||||||
|
Check when RLOGIN is enabled if ruserok() exists
|
||||||
|
|
||||||
|
Move selinux_file_context out of lib/copydir.c
|
||||||
|
|
||||||
|
Review hardcoded root account?
|
||||||
|
|
||||||
|
review all call to strto
|
||||||
|
|
||||||
|
lib/cleanup_user.c
|
||||||
|
cleanup needed (cleanup_report_add_user* not used)
|
||||||
|
|
||||||
|
|
||||||
|
libxcrypt support
|
||||||
|
* http://wiki.linuxfromscratch.org/patches/browser/trunk/shadow/shadow-4.0.18.1-owl_blowfish-1.patch
|
||||||
|
|
||||||
|
implement getlong, getulong.
|
||||||
|
avoid atoi, atol, atoul, strtol, strtoul, ...
|
||||||
|
|
||||||
|
manpages: comment the RLOGIN parts
|
||||||
|
|
||||||
|
Replace build_list (in lib/gshadow.c) and list (in lib/sgetgrent.c) by
|
||||||
|
comma_to_list()
|
||||||
|
|
||||||
|
Revert the modified files if all files could not be changed.
|
||||||
|
* or warn and indicate which files were modified and which were not.
|
||||||
|
* check the order the files are modified.
|
||||||
|
|
||||||
|
report nscd_flush_cache failures?
|
||||||
|
call nscd from the programs or from lib (commonio?)
|
||||||
|
|
||||||
|
PAM: check if a non-interactive conversation function could be used to set
|
||||||
|
the password in chpasswd and newusers
|
||||||
|
|
||||||
|
WITH_SELINUX
|
||||||
|
- review all tools to check that the strategies are consistent
|
||||||
|
|
||||||
|
chage, chfn, chsh: same change needed as in passwd.
|
||||||
|
- probably need moving check_selinux_access to a separate file.
|
||||||
|
|
||||||
|
testsuite
|
||||||
|
- newgrp
|
||||||
|
- test with unknown user's GID
|
||||||
|
|
||||||
|
newusers
|
||||||
|
- add logging to SYSLOG & AUDIT
|
||||||
|
- use CREATE_HOME
|
||||||
|
- Add a -Z option (see useradd / usermod)
|
||||||
|
|
||||||
|
Document when/where option appeared, document whether an option is standard
|
||||||
|
or not.
|
||||||
|
|
||||||
|
Check all the expiry semantics
|
||||||
|
|
||||||
|
ALL:
|
||||||
|
- move base passwd/shadow/group/gshadow operation to module for allow write
|
||||||
|
different backend modules for db, NIS, LDAP and others. Default backend it
|
||||||
|
will be goot if will be chosen depending on /etc/nsswitch.conf and allow
|
||||||
|
override this by -r <repository> options (where the <repository> can be
|
||||||
|
file, db, nis nisplus, ldap .. like on /etc/nsswitch.conf in service column).
|
||||||
|
passwd have old piece of code with handling -r option and it will be good
|
||||||
|
finish this and propagate on other shadow tools for allow operate on other
|
||||||
|
user databases by well known tools.
|
||||||
|
- Protect against signals. Register do_cleanups in a signal handler.
|
||||||
|
|
||||||
|
- login.defs
|
||||||
|
- generate depending on configuration
|
||||||
|
|
||||||
|
- useradd:
|
||||||
|
- add handle create user mail spool in maildir format.
|
||||||
|
- Add support for -k in -D mode
|
||||||
|
- Add support for -K in -D mode
|
||||||
|
- Add option to create or not the mail spool (and set the default in -D
|
||||||
|
mode)
|
||||||
|
- Change -l to reset the entry if an entry was already there
|
||||||
|
- set the mask in mkdir?
|
||||||
|
|
||||||
|
- userdel:
|
||||||
|
- add backup option for the removal of user resources,
|
||||||
|
- user_busy: check that the user is not running any processes.
|
||||||
|
- missing "deleting group" FAILED
|
||||||
|
- home dir removed, but userdel may fail and may leave the user
|
||||||
|
=> warning needed
|
||||||
|
|
||||||
|
- usermod
|
||||||
|
- add an option equivalent to useradd's -l (only when uid is changed)
|
||||||
|
- the mode of new home directories should be set according to the
|
||||||
|
original mode. Does copy_tree does this?
|
||||||
|
- user renamed, order is not kept in /etc/group (see
|
||||||
|
47_usermod-l_no_shadow_file). This is a problem when the first user is
|
||||||
|
considered as the admin.
|
||||||
|
- see mail "user ID change" on April, 15
|
||||||
|
+ fix call to chown (combination of -m and -u/-g)
|
||||||
|
+ add tests
|
||||||
|
|
||||||
|
- passwd:
|
||||||
|
- check combination of options (e.g. -u/-l)
|
||||||
|
- when -u refuse to unlock because it would create an empty password, it
|
||||||
|
should not display "Password changed."
|
||||||
|
exit instead?
|
||||||
|
|
||||||
|
- newgrp: check the USE_PAM section.
|
||||||
|
|
||||||
|
- pwck
|
||||||
|
- Add check to move passwd passwords to shadow if there is a shadow
|
||||||
|
entry (with a password).
|
||||||
|
- Add check to move passwd passwords to shadow if there is a shadow
|
||||||
|
file.
|
||||||
|
- Support an alternative /etc/tcb directory as second parameter.
|
||||||
|
- add options -g / -G to specify alternative group / gshadow files
|
||||||
|
|
||||||
|
- su
|
||||||
|
- add a login.defs configuration parameter to add variables to keep in
|
||||||
|
the environment with "su -l" (TERM/TERMCOLOR/...)
|
||||||
|
|
||||||
|
- vipw
|
||||||
|
- set ACLs and XATTRs on the temporary file (and backups?)
|
||||||
|
- vipw + selinux -> use lib/selinux.c
|
||||||
+3
-14
@@ -1,20 +1,9 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
|
|
||||||
autoreconf -v -f --install "$(dirname "$0")" || exit 1
|
autoreconf -v -f --install || exit 1
|
||||||
|
|
||||||
CFLAGS="-O2"
|
./configure \
|
||||||
CFLAGS="$CFLAGS -Wall"
|
CFLAGS="-O2 -Wall" \
|
||||||
CFLAGS="$CFLAGS -Wextra"
|
|
||||||
CFLAGS="$CFLAGS -Werror=implicit-function-declaration"
|
|
||||||
CFLAGS="$CFLAGS -Werror=implicit-int"
|
|
||||||
CFLAGS="$CFLAGS -Werror=incompatible-pointer-types"
|
|
||||||
CFLAGS="$CFLAGS -Werror=int-conversion"
|
|
||||||
CFLAGS="$CFLAGS -Wno-expansion-to-defined"
|
|
||||||
CFLAGS="$CFLAGS -Wno-unknown-attributes"
|
|
||||||
CFLAGS="$CFLAGS -Wno-unknown-warning-option"
|
|
||||||
|
|
||||||
"$(dirname "$0")"/configure \
|
|
||||||
CFLAGS="$CFLAGS" \
|
|
||||||
--enable-lastlog \
|
--enable-lastlog \
|
||||||
--enable-man \
|
--enable-man \
|
||||||
--enable-maintainer-mode \
|
--enable-maintainer-mode \
|
||||||
|
|||||||
+41
-20
@@ -1,12 +1,12 @@
|
|||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
m4_define([libsubid_abi_major], 5)
|
m4_define([libsubid_abi_major], 4)
|
||||||
m4_define([libsubid_abi_minor], 0)
|
m4_define([libsubid_abi_minor], 0)
|
||||||
m4_define([libsubid_abi_micro], 0)
|
m4_define([libsubid_abi_micro], 0)
|
||||||
m4_define([libsubid_abi], [libsubid_abi_major.libsubid_abi_minor.libsubid_abi_micro])
|
m4_define([libsubid_abi], [libsubid_abi_major.libsubid_abi_minor.libsubid_abi_micro])
|
||||||
AC_INIT([shadow], [4.17.2], [pkg-shadow-devel@lists.alioth.debian.org], [],
|
AC_INIT([shadow], [4.14.2], [pkg-shadow-devel@lists.alioth.debian.org], [],
|
||||||
[https://github.com/shadow-maint/shadow])
|
[https://github.com/shadow-maint/shadow])
|
||||||
AM_INIT_AUTOMAKE([1.11 foreign dist-xz subdir-objects tar-pax])
|
AM_INIT_AUTOMAKE([1.11 foreign dist-xz])
|
||||||
AC_CONFIG_MACRO_DIRS([m4])
|
AC_CONFIG_MACRO_DIRS([m4])
|
||||||
AM_SILENT_RULES([yes])
|
AM_SILENT_RULES([yes])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
@@ -32,7 +32,6 @@ AC_PROG_CC
|
|||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
AC_PROG_YACC
|
AC_PROG_YACC
|
||||||
LT_INIT
|
LT_INIT
|
||||||
LT_LIB_DLLOAD
|
|
||||||
|
|
||||||
dnl Checks for libraries.
|
dnl Checks for libraries.
|
||||||
|
|
||||||
@@ -48,8 +47,8 @@ AC_CHECK_HEADER([shadow.h],,[AC_MSG_ERROR([You need a libc with shadow.h])])
|
|||||||
|
|
||||||
AC_CHECK_FUNCS(arc4random_buf futimes \
|
AC_CHECK_FUNCS(arc4random_buf futimes \
|
||||||
getentropy getrandom getspnam getusershell \
|
getentropy getrandom getspnam getusershell \
|
||||||
initgroups lckpwdf lutimes \
|
initgroups lckpwdf lutimes mempcpy \
|
||||||
setgroups updwtmpx innetgr \
|
setgroups updwtmp updwtmpx innetgr \
|
||||||
getspnam_r \
|
getspnam_r \
|
||||||
rpmatch \
|
rpmatch \
|
||||||
memset_explicit explicit_bzero stpecpy stpeprintf)
|
memset_explicit explicit_bzero stpecpy stpeprintf)
|
||||||
@@ -57,13 +56,17 @@ AC_SYS_LARGEFILE
|
|||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
|
||||||
AC_CHECK_MEMBERS([struct utmpx.ut_name,
|
AC_CHECK_MEMBERS([struct utmp.ut_type,
|
||||||
struct utmpx.ut_host,
|
struct utmp.ut_id,
|
||||||
struct utmpx.ut_syslen,
|
struct utmp.ut_name,
|
||||||
struct utmpx.ut_addr,
|
struct utmp.ut_user,
|
||||||
struct utmpx.ut_addr_v6,
|
struct utmp.ut_host,
|
||||||
struct utmpx.ut_time,
|
struct utmp.ut_syslen,
|
||||||
struct utmpx.ut_xtime],,,[[#include <utmpx.h>]])
|
struct utmp.ut_addr,
|
||||||
|
struct utmp.ut_addr_v6,
|
||||||
|
struct utmp.ut_time,
|
||||||
|
struct utmp.ut_xtime,
|
||||||
|
struct utmp.ut_tv],,,[[#include <utmp.h>]])
|
||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
AC_TYPE_GETGROUPS
|
AC_TYPE_GETGROUPS
|
||||||
@@ -159,6 +162,13 @@ fi])
|
|||||||
AC_DEFINE_UNQUOTED(PASSWD_PROGRAM, "$shadow_cv_passwd_dir/passwd",
|
AC_DEFINE_UNQUOTED(PASSWD_PROGRAM, "$shadow_cv_passwd_dir/passwd",
|
||||||
[Path to passwd program.])
|
[Path to passwd program.])
|
||||||
|
|
||||||
|
dnl XXX - quick hack, should disappear before anyone notices :).
|
||||||
|
dnl XXX - I just read the above message :).
|
||||||
|
if test "$ac_cv_func_ruserok" = "yes"; then
|
||||||
|
AC_DEFINE(RLOGIN, 1, [Define if login should support the -r flag for rlogind.])
|
||||||
|
AC_DEFINE(RUSEROK, 0, [Define to the ruserok() "success" return value (0 or 1).])
|
||||||
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(shadowgrp,
|
AC_ARG_ENABLE(shadowgrp,
|
||||||
[AS_HELP_STRING([--enable-shadowgrp], [enable shadow group support @<:@default=yes@:>@])],
|
[AS_HELP_STRING([--enable-shadowgrp], [enable shadow group support @<:@default=yes@:>@])],
|
||||||
[case "${enableval}" in
|
[case "${enableval}" in
|
||||||
@@ -233,6 +243,9 @@ AC_ARG_WITH(skey,
|
|||||||
AC_ARG_WITH(tcb,
|
AC_ARG_WITH(tcb,
|
||||||
[AS_HELP_STRING([--with-tcb], [use tcb support (incomplete) @<:@default=yes if found@:>@])],
|
[AS_HELP_STRING([--with-tcb], [use tcb support (incomplete) @<:@default=yes if found@:>@])],
|
||||||
[with_tcb=$withval], [with_tcb=maybe])
|
[with_tcb=$withval], [with_tcb=maybe])
|
||||||
|
AC_ARG_WITH(libcrack,
|
||||||
|
[AS_HELP_STRING([--with-libcrack], [use libcrack @<:@default=no@:>@])],
|
||||||
|
[with_libcrack=$withval], [with_libcrack=no])
|
||||||
AC_ARG_WITH(sha-crypt,
|
AC_ARG_WITH(sha-crypt,
|
||||||
[AS_HELP_STRING([--with-sha-crypt], [allow the SHA256 and SHA512 password encryption algorithms @<:@default=yes@:>@])],
|
[AS_HELP_STRING([--with-sha-crypt], [allow the SHA256 and SHA512 password encryption algorithms @<:@default=yes@:>@])],
|
||||||
[with_sha_crypt=$withval], [with_sha_crypt=yes])
|
[with_sha_crypt=$withval], [with_sha_crypt=yes])
|
||||||
@@ -267,7 +280,6 @@ AC_DEFINE_UNQUOTED(GROUP_NAME_MAX_LENGTH, $with_group_name_max_length, [max grou
|
|||||||
AC_SUBST(GROUP_NAME_MAX_LENGTH)
|
AC_SUBST(GROUP_NAME_MAX_LENGTH)
|
||||||
GROUP_NAME_MAX_LENGTH="$with_group_name_max_length"
|
GROUP_NAME_MAX_LENGTH="$with_group_name_max_length"
|
||||||
|
|
||||||
|
|
||||||
AM_CONDITIONAL(USE_SHA_CRYPT, test "x$with_sha_crypt" = "xyes")
|
AM_CONDITIONAL(USE_SHA_CRYPT, test "x$with_sha_crypt" = "xyes")
|
||||||
if test "$with_sha_crypt" = "yes"; then
|
if test "$with_sha_crypt" = "yes"; then
|
||||||
AC_DEFINE(USE_SHA_CRYPT, 1, [Define to allow the SHA256 and SHA512 password encryption algorithms])
|
AC_DEFINE(USE_SHA_CRYPT, 1, [Define to allow the SHA256 and SHA512 password encryption algorithms])
|
||||||
@@ -304,10 +316,6 @@ dnl needed (Linux glibc, Irix), but still link it if needed (Solaris).
|
|||||||
|
|
||||||
AC_SEARCH_LIBS(gethostbyname, nsl)
|
AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||||
|
|
||||||
PKG_CHECK_MODULES([CMOCKA], [cmocka], [have_cmocka="yes"],
|
|
||||||
[AC_MSG_WARN([libcmocka not found, cmocka tests will not be built])])
|
|
||||||
AM_CONDITIONAL([HAVE_CMOCKA], [test x$have_cmocka = xyes])
|
|
||||||
|
|
||||||
AC_CHECK_LIB([econf],[econf_readDirs],[LIBECONF="-leconf"],[LIBECONF=""])
|
AC_CHECK_LIB([econf],[econf_readDirs],[LIBECONF="-leconf"],[LIBECONF=""])
|
||||||
if test -n "$LIBECONF"; then
|
if test -n "$LIBECONF"; then
|
||||||
AC_DEFINE_UNQUOTED([VENDORDIR], ["$enable_vendordir"],
|
AC_DEFINE_UNQUOTED([VENDORDIR], ["$enable_vendordir"],
|
||||||
@@ -426,6 +434,7 @@ if test "$with_libbsd" != "no"; then
|
|||||||
AC_DEFINE(WITH_LIBBSD, 1, [Build shadow with libbsd support])
|
AC_DEFINE(WITH_LIBBSD, 1, [Build shadow with libbsd support])
|
||||||
else
|
else
|
||||||
AC_DEFINE(WITH_LIBBSD, 0, [Build shadow without libbsd support])
|
AC_DEFINE(WITH_LIBBSD, 0, [Build shadow without libbsd support])
|
||||||
|
AC_CHECK_FUNC(strlcpy, [], [AC_MSG_ERROR([strlcpy is required from glibc >= 2.38 or libbsd])])
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL(WITH_LIBBSD, test x$with_libbsd = xyes)
|
AM_CONDITIONAL(WITH_LIBBSD, test x$with_libbsd = xyes)
|
||||||
|
|
||||||
@@ -513,6 +522,17 @@ if test "$with_audit" != "no"; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AC_SUBST(LIBCRACK)
|
||||||
|
if test "$with_libcrack" = "yes"; then
|
||||||
|
echo "checking cracklib flavour, don't be surprised by the results"
|
||||||
|
AC_CHECK_LIB(crack, FascistCheck,
|
||||||
|
[LIBCRACK=-lcrack AC_DEFINE(HAVE_LIBCRACK, 1, [Defined if you have libcrack.])])
|
||||||
|
AC_CHECK_LIB(crack, FascistHistory,
|
||||||
|
AC_DEFINE(HAVE_LIBCRACK_HIST, 1, [Defined if you have the ts&szs cracklib.]))
|
||||||
|
AC_CHECK_LIB(crack, FascistHistoryPw,
|
||||||
|
AC_DEFINE(HAVE_LIBCRACK_PW, 1, [Defined if it includes *Pw functions.]))
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$with_btrfs" != "no"; then
|
if test "$with_btrfs" != "no"; then
|
||||||
AC_CHECK_HEADERS([sys/statfs.h linux/magic.h linux/btrfs_tree.h], \
|
AC_CHECK_HEADERS([sys/statfs.h linux/magic.h linux/btrfs_tree.h], \
|
||||||
[btrfs_headers="yes"], [btrfs_headers="no"])
|
[btrfs_headers="yes"], [btrfs_headers="no"])
|
||||||
@@ -689,7 +709,7 @@ AC_SUBST(LIBMD)
|
|||||||
if test "$with_skey" = "yes"; then
|
if test "$with_skey" = "yes"; then
|
||||||
AC_CHECK_LIB(md, MD5Init, [LIBMD=-lmd])
|
AC_CHECK_LIB(md, MD5Init, [LIBMD=-lmd])
|
||||||
AC_CHECK_LIB(skey, skeychallenge, [LIBSKEY=-lskey],
|
AC_CHECK_LIB(skey, skeychallenge, [LIBSKEY=-lskey],
|
||||||
[AC_MSG_ERROR([libskey missing. You can download S/Key source code from http://rsync1.it.gentoo.org/gentoo/distfiles/skey-1.1.5.tar.bz2])])
|
[AC_MSG_ERROR([liskey missing. You can download S/Key source code from http://rsync1.it.gentoo.org/gentoo/distfiles/skey-1.1.5.tar.bz2])])
|
||||||
AC_DEFINE(SKEY, 1, [Define to support S/Key logins.])
|
AC_DEFINE(SKEY, 1, [Define to support S/Key logins.])
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -741,7 +761,7 @@ AC_CONFIG_FILES([
|
|||||||
etc/Makefile
|
etc/Makefile
|
||||||
etc/pam.d/Makefile
|
etc/pam.d/Makefile
|
||||||
etc/shadow-maint/Makefile
|
etc/shadow-maint/Makefile
|
||||||
tests/unit/Makefile
|
shadow.spec
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
@@ -749,6 +769,7 @@ echo
|
|||||||
echo "shadow will be compiled with the following features:"
|
echo "shadow will be compiled with the following features:"
|
||||||
echo
|
echo
|
||||||
echo " auditing support: $with_audit"
|
echo " auditing support: $with_audit"
|
||||||
|
echo " CrackLib support: $with_libcrack"
|
||||||
echo " PAM support: $with_libpam"
|
echo " PAM support: $with_libpam"
|
||||||
if test "$with_libpam" = "yes"; then
|
if test "$with_libpam" = "yes"; then
|
||||||
echo " suid account management tools: $enable_acct_tools_setuid"
|
echo " suid account management tools: $enable_acct_tools_setuid"
|
||||||
|
|||||||
+3
-1
@@ -1,4 +1,6 @@
|
|||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
# and also cooperate to make a distribution for `make dist'
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
EXTRA_DIST = README adduser.c adduser.sh adduser2.sh
|
EXTRA_DIST = README adduser.c adduser.sh adduser2.sh \
|
||||||
|
atudel groupmems.shar shadow-anonftp.patch \
|
||||||
|
udbachk.tgz
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ People keep sending various adduser programs and scripts... They are
|
|||||||
all in this directory. I haven't tested them, use at your own risk.
|
all in this directory. I haven't tested them, use at your own risk.
|
||||||
Anyway, the best one I've seen so far is adduser-3.x from Debian.
|
Anyway, the best one I've seen so far is adduser-3.x from Debian.
|
||||||
|
|
||||||
|
atudel is a perl script to remove at jobs owned by the specified user
|
||||||
|
(atrm in at-2.9 for Linux can't do that).
|
||||||
|
|
||||||
udbachk.tgz is a passwd/group/shadow file integrity checker.
|
udbachk.tgz is a passwd/group/shadow file integrity checker.
|
||||||
|
|
||||||
--marekm
|
--marekm
|
||||||
|
|||||||
+10
-11
@@ -118,9 +118,6 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
|
||||||
#include "string/strcmp/streq.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define IMMEDIATE_CHANGE /* Expire newly created password, must be changed
|
#define IMMEDIATE_CHANGE /* Expire newly created password, must be changed
|
||||||
* immediately upon next login */
|
* immediately upon next login */
|
||||||
#define HAVE_QUOTAS /* Obvious */
|
#define HAVE_QUOTAS /* Obvious */
|
||||||
@@ -294,10 +291,12 @@ main (void)
|
|||||||
printf ("Home Directory [%s/%s]: ", DEFAULT_HOME, usrname);
|
printf ("Home Directory [%s/%s]: ", DEFAULT_HOME, usrname);
|
||||||
fflush (stdout);
|
fflush (stdout);
|
||||||
safeget (dir, sizeof (dir));
|
safeget (dir, sizeof (dir));
|
||||||
if (!strlen(dir)) /* hit return */
|
if (!strlen (dir))
|
||||||
sprintf(dir, "%s/%s", DEFAULT_HOME, usrname);
|
{ /* hit return */
|
||||||
|
sprintf (dir, "%s/%s", DEFAULT_HOME, usrname);
|
||||||
|
}
|
||||||
else if (dir[strlen (dir) - 1] == '/')
|
else if (dir[strlen (dir) - 1] == '/')
|
||||||
strcat(dir, usrname);
|
sprintf (dir+strlen(dir), "%s", usrname);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -309,7 +308,7 @@ main (void)
|
|||||||
fflush (stdout);
|
fflush (stdout);
|
||||||
safeget (shell, sizeof (shell));
|
safeget (shell, sizeof (shell));
|
||||||
if (!strlen (shell))
|
if (!strlen (shell))
|
||||||
strcpy(shell, DEFAULT_SHELL);
|
sprintf (shell, "%s", DEFAULT_SHELL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *sh;
|
char *sh;
|
||||||
@@ -317,7 +316,7 @@ main (void)
|
|||||||
#ifdef HAVE_GETUSERSHELL
|
#ifdef HAVE_GETUSERSHELL
|
||||||
setusershell ();
|
setusershell ();
|
||||||
while ((sh = getusershell ()) != NULL)
|
while ((sh = getusershell ()) != NULL)
|
||||||
if (streq(shell, sh))
|
if (!strcmp (shell, sh))
|
||||||
ok = 1;
|
ok = 1;
|
||||||
endusershell ();
|
endusershell ();
|
||||||
#endif
|
#endif
|
||||||
@@ -328,7 +327,7 @@ main (void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf ("Shell NOT in /etc/shells, DEFAULT used\n");
|
printf ("Shell NOT in /etc/shells, DEFAULT used\n");
|
||||||
strcpy(shell, DEFAULT_SHELL);
|
sprintf (shell, "%s", DEFAULT_SHELL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -492,12 +491,12 @@ safeget (char *buf, int maxlen)
|
|||||||
bad = (!isalnum (c) && (c != '_') && (c != ' '));
|
bad = (!isalnum (c) && (c != '_') && (c != ' '));
|
||||||
*(buf++) = c;
|
*(buf++) = c;
|
||||||
}
|
}
|
||||||
stpcpy(buf, "");
|
*buf = '\0';
|
||||||
|
|
||||||
if (bad)
|
if (bad)
|
||||||
{
|
{
|
||||||
printf ("\nString contained banned character. Please stick to alphanumerics.\n");
|
printf ("\nString contained banned character. Please stick to alphanumerics.\n");
|
||||||
stpcpy(bstart, "");
|
*bstart = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Executable
+58
@@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
#
|
||||||
|
# SPDX-FileCopyrightText: 1996 Brian R. Gaeke
|
||||||
|
# SPDX-License-Identifier: BSD-4-Clause
|
||||||
|
#
|
||||||
|
# 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;
|
||||||
@@ -0,0 +1,465 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# This is a shell archive (produced by GNU sharutils 4.2.1).
|
||||||
|
# To extract the files from this archive, save it to some FILE, remove
|
||||||
|
# everything before the `!/bin/sh' line above, then type `sh FILE'.
|
||||||
|
#
|
||||||
|
# Made on 2000-05-25 14:41 CDT by <gk4@gnu.austin.ibm.com>.
|
||||||
|
# Source directory was `/home/gk4/src/groupmem'.
|
||||||
|
#
|
||||||
|
# Existing files will *not* be overwritten unless `-c' is specified.
|
||||||
|
#
|
||||||
|
# This shar contains:
|
||||||
|
# length mode name
|
||||||
|
# ------ ---------- ------------------------------------------
|
||||||
|
# 1960 -rw-r--r-- Makefile
|
||||||
|
# 6348 -rw-r--r-- groupmems.c
|
||||||
|
# 3372 -rw------- groupmems.8
|
||||||
|
#
|
||||||
|
save_IFS="${IFS}"
|
||||||
|
IFS="${IFS}:"
|
||||||
|
gettext_dir=FAILED
|
||||||
|
locale_dir=FAILED
|
||||||
|
first_param="$1"
|
||||||
|
for dir in $PATH
|
||||||
|
do
|
||||||
|
if test "$gettext_dir" = FAILED && test -f $dir/gettext \
|
||||||
|
&& ($dir/gettext --version >/dev/null 2>&1)
|
||||||
|
then
|
||||||
|
set `$dir/gettext --version 2>&1`
|
||||||
|
if test "$3" = GNU
|
||||||
|
then
|
||||||
|
gettext_dir=$dir
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "$locale_dir" = FAILED && test -f $dir/shar \
|
||||||
|
&& ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
|
||||||
|
then
|
||||||
|
locale_dir=`$dir/shar --print-text-domain-dir`
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$save_IFS"
|
||||||
|
if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
|
||||||
|
then
|
||||||
|
echo=echo
|
||||||
|
else
|
||||||
|
TEXTDOMAINDIR=$locale_dir
|
||||||
|
export TEXTDOMAINDIR
|
||||||
|
TEXTDOMAIN=sharutils
|
||||||
|
export TEXTDOMAIN
|
||||||
|
echo="$gettext_dir/gettext -s"
|
||||||
|
fi
|
||||||
|
if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then
|
||||||
|
shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"'
|
||||||
|
elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then
|
||||||
|
shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"'
|
||||||
|
elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then
|
||||||
|
shar_touch='touch -am $3$4$5$6$2 "$8"'
|
||||||
|
else
|
||||||
|
shar_touch=:
|
||||||
|
echo
|
||||||
|
$echo 'WARNING: not restoring timestamps. Consider getting and'
|
||||||
|
$echo "installing GNU \`touch', distributed in GNU File Utilities..."
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch
|
||||||
|
#
|
||||||
|
if mkdir _sh10937; then
|
||||||
|
$echo 'x -' 'creating lock directory'
|
||||||
|
else
|
||||||
|
$echo 'failed to create lock directory'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# ============= Makefile ==============
|
||||||
|
if test -f 'Makefile' && test "$first_param" != -c; then
|
||||||
|
$echo 'x -' SKIPPING 'Makefile' '(file already exists)'
|
||||||
|
else
|
||||||
|
$echo 'x -' extracting 'Makefile' '(text)'
|
||||||
|
sed 's/^X//' << 'SHAR_EOF' > 'Makefile' &&
|
||||||
|
/*
|
||||||
|
# SPDX-FileCopyrightText: 2000, International Business Machines, Inc.
|
||||||
|
# SPDX-FileCopyrightText: 2000, George Kraft IV, gk4@us.ibm.com
|
||||||
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
#
|
||||||
|
X
|
||||||
|
all: groupmems
|
||||||
|
X
|
||||||
|
groupmems: groupmems.c
|
||||||
|
X cc -g -o groupmems groupmems.c -L. -lshadow
|
||||||
|
X
|
||||||
|
install: groupmems
|
||||||
|
X -/usr/sbin/groupadd groups
|
||||||
|
X install -o root -g groups -m 4770 groupmems /usr/bin
|
||||||
|
X
|
||||||
|
install.man: groupmems.8
|
||||||
|
X install -o root -g root -m 644 groupmems.8 /usr/man/man8
|
||||||
|
X
|
||||||
|
SHAR_EOF
|
||||||
|
(set 20 00 05 25 14 40 28 'Makefile'; eval "$shar_touch") &&
|
||||||
|
chmod 0644 'Makefile' ||
|
||||||
|
$echo 'restore of' 'Makefile' 'failed'
|
||||||
|
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
|
||||||
|
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
|
||||||
|
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|
||||||
|
|| $echo 'Makefile:' 'MD5 check failed'
|
||||||
|
b46cf7ef8d59149093c011ced3f3103c Makefile
|
||||||
|
SHAR_EOF
|
||||||
|
else
|
||||||
|
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'Makefile'`"
|
||||||
|
test 1960 -eq "$shar_count" ||
|
||||||
|
$echo 'Makefile:' 'original size' '1960,' 'current size' "$shar_count!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
# ============= groupmems.c ==============
|
||||||
|
if test -f 'groupmems.c' && test "$first_param" != -c; then
|
||||||
|
$echo 'x -' SKIPPING 'groupmems.c' '(file already exists)'
|
||||||
|
else
|
||||||
|
$echo 'x -' extracting 'groupmems.c' '(text)'
|
||||||
|
sed 's/^X//' << 'SHAR_EOF' > 'groupmems.c' &&
|
||||||
|
/*
|
||||||
|
X * SPDX-FileCopyrightText: 2000, International Business Machines, Inc.
|
||||||
|
X * SPDX-FileCopyrightText: 2000, George Kraft IV, gk4@us.ibm.com
|
||||||
|
X * SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
X */
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Utility "groupmem" adds and deletes members from a user's group.
|
||||||
|
**
|
||||||
|
** Setup (as "root"):
|
||||||
|
**
|
||||||
|
** groupadd -r groups
|
||||||
|
** chmod 2770 groupmems
|
||||||
|
** chown root.groups groupmems
|
||||||
|
** groupmems -g groups -a gk4
|
||||||
|
**
|
||||||
|
** Usage (as "gk4"):
|
||||||
|
**
|
||||||
|
** groupmems -a olive
|
||||||
|
** groupmems -a jordan
|
||||||
|
** groupmems -a meghan
|
||||||
|
** groupmems -a morgan
|
||||||
|
** groupmems -a jake
|
||||||
|
** groupmems -l
|
||||||
|
** groupmems -d jake
|
||||||
|
** groupmems -l
|
||||||
|
*/
|
||||||
|
X
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include "defines.h"
|
||||||
|
#include "groupio.h"
|
||||||
|
X
|
||||||
|
/* Exit Status Values */
|
||||||
|
X
|
||||||
|
#define EXIT_SUCCESS 0 /* success */
|
||||||
|
#define EXIT_USAGE 1 /* invalid command syntax */
|
||||||
|
#define EXIT_GROUP_FILE 2 /* group file access problems */
|
||||||
|
#define EXIT_NOT_ROOT 3 /* not superuser */
|
||||||
|
#define EXIT_NOT_EROOT 4 /* not effective superuser */
|
||||||
|
#define EXIT_NOT_PRIMARY 5 /* not primary owner of group */
|
||||||
|
#define EXIT_NOT_MEMBER 6 /* member of group does not exist */
|
||||||
|
#define EXIT_MEMBER_EXISTS 7 /* member of group already exists */
|
||||||
|
X
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
X
|
||||||
|
/* Globals */
|
||||||
|
X
|
||||||
|
extern int optind;
|
||||||
|
extern char *optarg;
|
||||||
|
static char *adduser = NULL;
|
||||||
|
static char *deluser = NULL;
|
||||||
|
static char *thisgroup = NULL;
|
||||||
|
static int purge = FALSE;
|
||||||
|
static int list = FALSE;
|
||||||
|
static int exclusive = 0;
|
||||||
|
X
|
||||||
|
static int isroot(void) {
|
||||||
|
X return getuid() ? FALSE : TRUE;
|
||||||
|
}
|
||||||
|
X
|
||||||
|
static int isgroup(void) {
|
||||||
|
X gid_t g = getgid();
|
||||||
|
X struct group *grp = getgrgid(g);
|
||||||
|
X
|
||||||
|
X return TRUE;
|
||||||
|
}
|
||||||
|
X
|
||||||
|
static char *whoami(void) {
|
||||||
|
X struct group *grp = getgrgid(getgid());
|
||||||
|
X struct passwd *usr = getpwuid(getuid());
|
||||||
|
X
|
||||||
|
X if (0 == strcmp(usr->pw_name, grp->gr_name)) {
|
||||||
|
X return (char *)strdup(usr->pw_name);
|
||||||
|
X } else {
|
||||||
|
X return NULL;
|
||||||
|
X }
|
||||||
|
}
|
||||||
|
X
|
||||||
|
static void
|
||||||
|
addtogroup(char *user, char **members) {
|
||||||
|
X int i;
|
||||||
|
X char **pmembers;
|
||||||
|
X
|
||||||
|
X for (i = 0; NULL != members[i]; i++ ) {
|
||||||
|
X if (0 == strcmp(user, members[i])) {
|
||||||
|
X fprintf(stderr, "Member already exists\n");
|
||||||
|
X exit(EXIT_MEMBER_EXISTS);
|
||||||
|
X }
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X if (0 == i) {
|
||||||
|
X pmembers = (char **)calloc(2, sizeof(char *));
|
||||||
|
X } else {
|
||||||
|
X pmembers = (char **)realloc(members, sizeof(char *)*(i+1));
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X *members = *pmembers;
|
||||||
|
X members[i] = user;
|
||||||
|
X members[i+1] = NULL;
|
||||||
|
}
|
||||||
|
X
|
||||||
|
static void
|
||||||
|
rmfromgroup(char *user, char **members) {
|
||||||
|
X int i;
|
||||||
|
X int found = FALSE;
|
||||||
|
X
|
||||||
|
X i = 0;
|
||||||
|
X while (!found && NULL != members[i]) {
|
||||||
|
X if (0 == strcmp(user, members[i])) {
|
||||||
|
X found = TRUE;
|
||||||
|
X } else {
|
||||||
|
X i++;
|
||||||
|
X }
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X while (found && NULL != members[i]) {
|
||||||
|
X members[i] = members[++i];
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X if (!found) {
|
||||||
|
X fprintf(stderr, "Member to remove could not be found\n");
|
||||||
|
X exit(EXIT_NOT_MEMBER);
|
||||||
|
X }
|
||||||
|
}
|
||||||
|
X
|
||||||
|
static void
|
||||||
|
nomembers(char **members) {
|
||||||
|
X int i;
|
||||||
|
X
|
||||||
|
X for (i = 0; NULL != members[i]; i++ ) {
|
||||||
|
X members[i] = NULL;
|
||||||
|
X }
|
||||||
|
}
|
||||||
|
X
|
||||||
|
static void
|
||||||
|
members(char **members) {
|
||||||
|
X int i;
|
||||||
|
X
|
||||||
|
X for (i = 0; NULL != members[i]; i++ ) {
|
||||||
|
X printf("%s ", members[i]);
|
||||||
|
X
|
||||||
|
X if (NULL == members[i+1]) {
|
||||||
|
X printf("\n");
|
||||||
|
X } else {
|
||||||
|
X printf(" ");
|
||||||
|
X }
|
||||||
|
X }
|
||||||
|
}
|
||||||
|
X
|
||||||
|
static void usage(void) {
|
||||||
|
X fprintf(stderr, "usage: groupmems -a username | -d username | -D | -l [-g groupname]\n");
|
||||||
|
X exit(EXIT_USAGE);
|
||||||
|
}
|
||||||
|
X
|
||||||
|
main(int argc, char **argv) {
|
||||||
|
X int arg, i;
|
||||||
|
X char *name;
|
||||||
|
X struct group *grp;
|
||||||
|
X
|
||||||
|
X while ((arg = getopt(argc, argv, "a:d:g:Dl")) != EOF) {
|
||||||
|
X switch (arg) {
|
||||||
|
X case 'a':
|
||||||
|
X adduser = strdup(optarg);
|
||||||
|
X ++exclusive;
|
||||||
|
X break;
|
||||||
|
X case 'd':
|
||||||
|
X deluser = strdup(optarg);
|
||||||
|
X ++exclusive;
|
||||||
|
X break;
|
||||||
|
X case 'g':
|
||||||
|
X thisgroup = strdup(optarg);
|
||||||
|
X break;
|
||||||
|
X case 'D':
|
||||||
|
X purge = TRUE;
|
||||||
|
X ++exclusive;
|
||||||
|
X break;
|
||||||
|
X case 'l':
|
||||||
|
X list = TRUE;
|
||||||
|
X ++exclusive;
|
||||||
|
X break;
|
||||||
|
X default:
|
||||||
|
X usage();
|
||||||
|
X }
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X if (exclusive > 1 || optind < argc) {
|
||||||
|
X usage();
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X if (!isroot() && NULL != thisgroup) {
|
||||||
|
X fprintf(stderr, "Only root can add members to different groups\n");
|
||||||
|
X exit(EXIT_NOT_ROOT);
|
||||||
|
X } else if (isroot() && NULL != thisgroup) {
|
||||||
|
X name = thisgroup;
|
||||||
|
X } else if (!isgroup()) {
|
||||||
|
X fprintf(stderr, "Group access is required\n");
|
||||||
|
X exit(EXIT_NOT_EROOT);
|
||||||
|
X } else if (NULL == (name = whoami())) {
|
||||||
|
X fprintf(stderr, "Not primary owner of current group\n");
|
||||||
|
X exit(EXIT_NOT_PRIMARY);
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X if (!gr_lock()) {
|
||||||
|
X fprintf(stderr, "Unable to lock group file\n");
|
||||||
|
X exit(EXIT_GROUP_FILE);
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X if (!gr_open(O_RDWR)) {
|
||||||
|
X fprintf(stderr, "Unable to open group file\n");
|
||||||
|
X exit(EXIT_GROUP_FILE);
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X grp = (struct group *)gr_locate(name);
|
||||||
|
X
|
||||||
|
X if (NULL != adduser) {
|
||||||
|
X addtogroup(adduser, grp->gr_mem);
|
||||||
|
X gr_update(grp);
|
||||||
|
X } else if (NULL != deluser) {
|
||||||
|
X rmfromgroup(deluser, grp->gr_mem);
|
||||||
|
X gr_update(grp);
|
||||||
|
X } else if (purge) {
|
||||||
|
X nomembers(grp->gr_mem);
|
||||||
|
X gr_update(grp);
|
||||||
|
X } else if (list) {
|
||||||
|
X members(grp->gr_mem);
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X if (!gr_close()) {
|
||||||
|
X fprintf(stderr, "Cannot close group file\n");
|
||||||
|
X exit(EXIT_GROUP_FILE);
|
||||||
|
X }
|
||||||
|
X
|
||||||
|
X gr_unlock();
|
||||||
|
X
|
||||||
|
X exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
X
|
||||||
|
/* EOF */
|
||||||
|
SHAR_EOF
|
||||||
|
(set 20 00 05 25 14 36 38 'groupmems.c'; eval "$shar_touch") &&
|
||||||
|
chmod 0644 'groupmems.c' ||
|
||||||
|
$echo 'restore of' 'groupmems.c' 'failed'
|
||||||
|
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
|
||||||
|
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
|
||||||
|
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|
||||||
|
|| $echo 'groupmems.c:' 'MD5 check failed'
|
||||||
|
f0dd68f8d762d89d24d3ce1f4141f981 groupmems.c
|
||||||
|
SHAR_EOF
|
||||||
|
else
|
||||||
|
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'groupmems.c'`"
|
||||||
|
test 6348 -eq "$shar_count" ||
|
||||||
|
$echo 'groupmems.c:' 'original size' '6348,' 'current size' "$shar_count!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
# ============= groupmems.8 ==============
|
||||||
|
if test -f 'groupmems.8' && test "$first_param" != -c; then
|
||||||
|
$echo 'x -' SKIPPING 'groupmems.8' '(file already exists)'
|
||||||
|
else
|
||||||
|
$echo 'x -' extracting 'groupmems.8' '(text)'
|
||||||
|
sed 's/^X//' << 'SHAR_EOF' > 'groupmems.8' &&
|
||||||
|
X.\"
|
||||||
|
X.\" SPDX-FileCopyrightText: 2000, International Business Machines, Inc.
|
||||||
|
X.\" SPDX-FileCopyrightText: 2000, George Kraft IV, gk4@us.ibm.com
|
||||||
|
X.\" SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
X.\"
|
||||||
|
X.\" $Id$
|
||||||
|
X.\"
|
||||||
|
X.TH GROUPMEMS 8
|
||||||
|
X.SH NAME
|
||||||
|
groupmems \- Administer members of a user's primary group
|
||||||
|
X.SH SYNOPSIS
|
||||||
|
X.B groupmems
|
||||||
|
\fB-a\fI user_name \fR |
|
||||||
|
\fB-d\fI user_name \fR |
|
||||||
|
\fB-l\fR |
|
||||||
|
\fB-D\fR |
|
||||||
|
[\fB-g\fI group_name \fR]
|
||||||
|
X.SH DESCRIPTION
|
||||||
|
The \fBgroupmems\fR utility allows a user to administer their own
|
||||||
|
group membership list without the requirement of superuser privileges.
|
||||||
|
The \fBgroupmems\fR utility is for systems that configure its users to
|
||||||
|
be in their own name sake primary group (i.e., guest / guest).
|
||||||
|
X.P
|
||||||
|
Only the superuser, as administrator, can use \fBgroupmems\fR to alter
|
||||||
|
the memberships of other groups.
|
||||||
|
X.IP "\fB-a \fIuser_name\fR"
|
||||||
|
Add a new user to the group membership list.
|
||||||
|
X.IP "\fB-d \fIuser_name\fR"
|
||||||
|
Delete a user from the group membership list.
|
||||||
|
X.IP "\fB-l\fR"
|
||||||
|
List the group membership list.
|
||||||
|
X.IP "\fB-D\fR"
|
||||||
|
Delete all users from the group membership list.
|
||||||
|
X.IP "\fB-g \fIgroup_name\fR"
|
||||||
|
The superuser can specify which group membership list to modify.
|
||||||
|
X.SH SETUP
|
||||||
|
The \fBgroupmems\fR executable should be in mode \fB2770\fR as user \fBroot\fR
|
||||||
|
and in group \fBgroups\fR. The system administrator can add users to
|
||||||
|
group groups to allow or disallow them using the \fBgroupmems\fR utility
|
||||||
|
to manager their own group membership list.
|
||||||
|
X.P
|
||||||
|
X $ groupadd -r groups
|
||||||
|
X.br
|
||||||
|
X $ chmod 2770 groupmems
|
||||||
|
X.br
|
||||||
|
X $ chown root.groups groupmems
|
||||||
|
X.br
|
||||||
|
X $ groupmems -g groups -a gk4
|
||||||
|
X.SH FILES
|
||||||
|
/etc/group
|
||||||
|
X.br
|
||||||
|
/etc/gshadow
|
||||||
|
X.SH SEE ALSO
|
||||||
|
X.BR chfn (1),
|
||||||
|
X.BR chsh (1),
|
||||||
|
X.BR useradd (8),
|
||||||
|
X.BR userdel (8),
|
||||||
|
X.BR usermod (8),
|
||||||
|
X.BR passwd (1),
|
||||||
|
X.BR groupadd (8),
|
||||||
|
X.BR groupdel (8)
|
||||||
|
X.SH AUTHOR
|
||||||
|
George Kraft IV (gk4@us.ibm.com)
|
||||||
|
X.\" EOF
|
||||||
|
SHAR_EOF
|
||||||
|
(set 20 00 05 25 14 38 23 'groupmems.8'; eval "$shar_touch") &&
|
||||||
|
chmod 0600 'groupmems.8' ||
|
||||||
|
$echo 'restore of' 'groupmems.8' 'failed'
|
||||||
|
if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
|
||||||
|
&& ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
|
||||||
|
md5sum -c << SHAR_EOF >/dev/null 2>&1 \
|
||||||
|
|| $echo 'groupmems.8:' 'MD5 check failed'
|
||||||
|
181e6cd3a3c9d3df320197fa2cde2b4a groupmems.8
|
||||||
|
SHAR_EOF
|
||||||
|
else
|
||||||
|
shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'groupmems.8'`"
|
||||||
|
test 3372 -eq "$shar_count" ||
|
||||||
|
$echo 'groupmems.8:' 'original size' '3372,' 'current size' "$shar_count!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -fr _sh10937
|
||||||
|
exit 0
|
||||||
@@ -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
|
||||||
|
anonymous ftp login (using the guestgroup feature in ftpaccess, which
|
||||||
|
means that the users home directory looks like '/home/user/./'). It also
|
||||||
|
adds a commandline argument to specify an initial directory structure
|
||||||
|
for such users, with a tarball normally containing the bin,lib,etc
|
||||||
|
directories used in the chrooted environment.
|
||||||
|
|
||||||
|
I am using it to automatically create chunks of users with only ftp
|
||||||
|
access for a webserver.
|
||||||
|
|
||||||
|
I have tried to follow your coding standards and I believe it is bug
|
||||||
|
free but.. well, who knows. :) It's not much code however.
|
||||||
|
|
||||||
|
I hope you find it useful. Do what you like with it, feel free to ask if
|
||||||
|
anything is unclear.
|
||||||
|
|
||||||
|
Best rgds,
|
||||||
|
Calle Karlsson
|
||||||
|
ckn@kash.se
|
||||||
|
|
||||||
|
diff -uNr shadow-980403.orig/src/newusers.c shadow-980403/src/newusers.c
|
||||||
|
--- shadow-980403.orig/src/newusers.c Fri Jan 30 00:22:43 1998
|
||||||
|
+++ shadow-980403/src/newusers.c Fri Apr 17 16:55:33 1998
|
||||||
|
@@ -76,11 +76,35 @@
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
- fprintf(stderr, "Usage: %s [ input ]\n", Prog);
|
||||||
|
+ fprintf (stderr, "Usage: %s [-p prototype tarfile] [ input ]\n", Prog);
|
||||||
|
+ fprintf (stderr, "The prototype tarfile is only used for users\n");
|
||||||
|
+ fprintf (stderr, "marked as anonymous ftp users. It must be a full pathname.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
+ * createuserdir - create a directory and chmod it
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+createuserdir (char * dir, int uid, int gid, int line)
|
||||||
|
+{
|
||||||
|
+ if (mkdir (dir, 0777 & ~getdef_num("UMASK", 077))) {
|
||||||
|
+ fprintf (stderr, "%s: line %d: mkdir %s failed\n",
|
||||||
|
+ Prog, line, dir);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (chown (dir, uid, gid)) {
|
||||||
|
+ fprintf (stderr, "%s: line %d: chown %s failed\n",
|
||||||
|
+ Prog, line, dir);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
* add_group - create a new group or add a user to an existing group
|
||||||
|
*/
|
||||||
|
|
||||||
|
@@ -328,6 +352,8 @@
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
+ char anonproto[BUFSIZ];
|
||||||
|
+ int flag;
|
||||||
|
char *fields[8];
|
||||||
|
int nfields;
|
||||||
|
char *cp;
|
||||||
|
@@ -340,12 +366,23 @@
|
||||||
|
|
||||||
|
Prog = Basename(argv[0]);
|
||||||
|
|
||||||
|
- if (argc > 1 && argv[1][0] == '-')
|
||||||
|
- usage ();
|
||||||
|
+ * anonproto = '\0';
|
||||||
|
+
|
||||||
|
+ while ((flag = getopt (argc, argv, "p:h")) != EOF) {
|
||||||
|
+ switch (flag) {
|
||||||
|
+ case 'p':
|
||||||
|
+ STRFCPY(anonproto, optarg);
|
||||||
|
+ break;
|
||||||
|
+ case 'h':
|
||||||
|
+ default:
|
||||||
|
+ usage ();
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (argc == 2) {
|
||||||
|
- if (! freopen (argv[1], "r", stdin)) {
|
||||||
|
- snprintf(buf, sizeof buf, "%s: %s", Prog, argv[1]);
|
||||||
|
+ if (optind < argc) {
|
||||||
|
+ if (! freopen (argv[optind], "r", stdin)) {
|
||||||
|
+ snprintf(buf, sizeof buf, "%s: %s", Prog, argv[optind]);
|
||||||
|
perror (buf);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
@@ -499,15 +536,36 @@
|
||||||
|
if (fields[6][0])
|
||||||
|
newpw.pw_shell = fields[6];
|
||||||
|
|
||||||
|
- if (newpw.pw_dir[0] && access(newpw.pw_dir, F_OK)) {
|
||||||
|
- if (mkdir (newpw.pw_dir,
|
||||||
|
- 0777 & ~getdef_num("UMASK", 077)))
|
||||||
|
- fprintf (stderr, "%s: line %d: mkdir failed\n",
|
||||||
|
- Prog, line);
|
||||||
|
- else if (chown (newpw.pw_dir,
|
||||||
|
- newpw.pw_uid, newpw.pw_gid))
|
||||||
|
- fprintf (stderr, "%s: line %d: chown failed\n",
|
||||||
|
- Prog, line);
|
||||||
|
+ if (newpw.pw_dir[0]) {
|
||||||
|
+ char * userdir = strdup (newpw.pw_dir);
|
||||||
|
+ char * anonpart;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ if ((anonpart = strstr (userdir, "/./"))) {
|
||||||
|
+ * anonpart = '\0';
|
||||||
|
+ anonpart += 2;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (access(userdir, F_OK))
|
||||||
|
+ rc = createuserdir (userdir, newpw.pw_uid, newpw.pw_gid, line);
|
||||||
|
+ else
|
||||||
|
+ rc = 0;
|
||||||
|
+
|
||||||
|
+ if (rc == 0 && anonpart) {
|
||||||
|
+ if (* anonproto) {
|
||||||
|
+ char cmdbuf [BUFSIZ];
|
||||||
|
+ snprintf(cmdbuf, sizeof cmdbuf,
|
||||||
|
+ "cd %s; tar xf %s",
|
||||||
|
+ userdir, anonproto);
|
||||||
|
+ system (cmdbuf);
|
||||||
|
+ }
|
||||||
|
+ if (strlen (anonpart) > 1) {
|
||||||
|
+ strcat (userdir, anonpart);
|
||||||
|
+ if (access (userdir, F_OK))
|
||||||
|
+ createuserdir (userdir, newpw.pw_uid, newpw.pw_gid, line);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ free (userdir);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
Binary file not shown.
@@ -471,12 +471,12 @@
|
|||||||
|
|
||||||
The Shadow Suite contains replacement programs for:
|
The Shadow Suite contains replacement programs for:
|
||||||
|
|
||||||
su, login, passwd, newgrp, chfn, chsh
|
su, login, passwd, newgrp, chfn, chsh, and id
|
||||||
|
|
||||||
The package also contains the new programs:
|
The package also contains the new programs:
|
||||||
|
|
||||||
chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod,
|
chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod,
|
||||||
groupadd, groupdel, groupmod, pwck, grpck, lastlog, pwconv,
|
groupadd, groupdel, groupmod, groups, pwck, grpck, lastlog, pwconv,
|
||||||
and pwunconv
|
and pwunconv
|
||||||
|
|
||||||
Additionally, the library: libshadow.a is included for writing and/or
|
Additionally, the library: libshadow.a is included for writing and/or
|
||||||
@@ -586,6 +586,8 @@
|
|||||||
|
|
||||||
· /usr/bin/chsh
|
· /usr/bin/chsh
|
||||||
|
|
||||||
|
· /usr/bin/id
|
||||||
|
|
||||||
The BETA package has a save target in the Makefile, but it's commented
|
The BETA package has a save target in the Makefile, but it's commented
|
||||||
out because different distributions place the programs in different
|
out because different distributions place the programs in different
|
||||||
places.
|
places.
|
||||||
@@ -635,6 +637,8 @@
|
|||||||
|
|
||||||
· /usr/man/man1/chsh.1.gz
|
· /usr/man/man1/chsh.1.gz
|
||||||
|
|
||||||
|
· /usr/man/man1/id.1.gz
|
||||||
|
|
||||||
· /usr/man/man1/login.1.gz
|
· /usr/man/man1/login.1.gz
|
||||||
|
|
||||||
· /usr/man/man1/passwd.1.gz
|
· /usr/man/man1/passwd.1.gz
|
||||||
@@ -1373,7 +1377,7 @@
|
|||||||
users or changing the group password, the /etc/gshadow file will be
|
users or changing the group password, the /etc/gshadow file will be
|
||||||
changed.
|
changed.
|
||||||
|
|
||||||
The programs groupadd, groupmod, and groupdel are provided as
|
The programs groups, groupadd, groupmod, and groupdel are provided as
|
||||||
part of the Shadow Suite to modify groups.
|
part of the Shadow Suite to modify groups.
|
||||||
|
|
||||||
The format of the /etc/group file is as follows:
|
The format of the /etc/group file is as follows:
|
||||||
|
|||||||
+2
-1
@@ -1,4 +1,5 @@
|
|||||||
# This is a dummy Makefile.am to get automake work flawlessly,
|
# This is a dummy Makefile.am to get automake work flawlessly,
|
||||||
# and also cooperate to make a distribution for `make dist'
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
EXTRA_DIST = HOWTO README.limits
|
EXTRA_DIST = HOWTO README.limits \
|
||||||
|
README.platforms WISHLIST console.c.spec.txt cracklib26.diff
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# $Id$
|
||||||
|
#
|
||||||
|
# This is the current (still incomplete) list of platforms this
|
||||||
|
# package has been verified to work on. Additions (preferably
|
||||||
|
# in the format as described below) are welcome. Thanks!
|
||||||
|
#
|
||||||
|
# V: last version reported to work
|
||||||
|
# H: host type
|
||||||
|
# L: Linux libc version
|
||||||
|
# D: Linux distribution, or other OS name and version
|
||||||
|
# C: changes (if any)
|
||||||
|
# R: reported by
|
||||||
|
|
||||||
|
V: 980529
|
||||||
|
H: sparc-unknown-linux-gnu
|
||||||
|
L: glibc-2.0.7
|
||||||
|
D: Ultrapenguin-1.0.9
|
||||||
|
C: had to explicitly disable desrpc.
|
||||||
|
R: Bjorn Christianson <bjorn@cascade.psychology.mcmaster.ca>
|
||||||
|
|
||||||
|
V: 980724
|
||||||
|
H: i486-pc-linux-gnulibc1
|
||||||
|
L: libc-5.4.33
|
||||||
|
D: Debian-1.3.1.r6
|
||||||
|
C: none (use dpkg-buildpackage)
|
||||||
|
R: Marek Michalkiewicz <marekm@linux.org.pl>
|
||||||
|
|
||||||
|
V: current
|
||||||
|
H: i686-pc-linux-gnu
|
||||||
|
L: glibc-2.0.7.19981211
|
||||||
|
D: Debian-2.1
|
||||||
|
C: none (use dpkg-buildpackage)
|
||||||
|
R: Marek Michalkiewicz <marekm@linux.org.pl>
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
$Id$
|
||||||
|
|
||||||
|
This is my wishlist for the shadow suite, in no particular order. Feel
|
||||||
|
free to do anything from this list and mail me the diffs :-).
|
||||||
|
|
||||||
|
Patches in diff -u format, against the latest version (sometimes in the
|
||||||
|
"beta" directory) are preferred and make my job easier. Please, no
|
||||||
|
MIME, base64, quoted-printable, or HTML. For very big patches, or if
|
||||||
|
your mailer can corrupt them, please use gzip and uuencode. Thanks!
|
||||||
|
|
||||||
|
New ideas to add to this list are welcome, too. --marekm
|
||||||
|
|
||||||
|
- fix all the bugs, of course
|
||||||
|
- implement "su only" accounts (no logins, only su from other account)
|
||||||
|
- rewrite getdef.c to be more general? (no hardcoded names)
|
||||||
|
- patch for rlogind/telnetd to create utmp entry and fill in ut_addr
|
||||||
|
- option to specify encrypted password in passwd (for yppasswdd, so it
|
||||||
|
doesn't need to know about shadow/non-shadow); should probably use a pipe
|
||||||
|
(less insecure than command line arguments)
|
||||||
|
- add support for changing NIS passwords
|
||||||
|
- add option to check passwords by piping them to external programs
|
||||||
|
- add functionality of the contrib/rpasswd.c wrapper to passwd
|
||||||
|
- option to generate pronounceable passwords (like on SCO), external program?
|
||||||
|
- poppassd (remote password change for eudora etc.)
|
||||||
|
- add support for passwd/shadow db files (glibc)
|
||||||
|
- vipw: check password files for errors after editing
|
||||||
|
- add "maximum time users allowed to stay logged in" limit option to logoutd
|
||||||
|
- handle quotes in /etc/environment like the shell does (but sshd doesn't...)
|
||||||
|
- better OPIE support (report number of logins left, etc.)
|
||||||
|
- new option for /etc/suauth: don't load user's environment (force "su -")
|
||||||
|
suggested by Ulisses Alonso Camaro
|
||||||
|
- find out why recent releases won't compile on Solaris
|
||||||
|
- newusers should be able to copy /etc/skel to the new home directory
|
||||||
|
(like useradd)
|
||||||
|
- add directories where other packages can add hooks for package-specific
|
||||||
|
per-user configuration, to be executed with run-parts. Some hooks should
|
||||||
|
be executed at package install time for existing users, likewise for
|
||||||
|
package removal and possibly modification. (Debian Bug#36019)
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
$Id$
|
||||||
|
|
||||||
|
Specification for console.c source file --
|
||||||
|
|
||||||
|
input values --
|
||||||
|
tty -- character pointer to device name with leading "/dev/"
|
||||||
|
removed.
|
||||||
|
|
||||||
|
return values --
|
||||||
|
0 -- false
|
||||||
|
1 -- true
|
||||||
|
|
||||||
|
int console (char * tty)
|
||||||
|
if "CONSOLE" string value is not present in login.defs
|
||||||
|
return true
|
||||||
|
|
||||||
|
if the first character of "CONSOLE" string value is not "/"
|
||||||
|
treat the string as a ":" delimited list of device
|
||||||
|
names and search for the value of tty in that
|
||||||
|
tokenized list.
|
||||||
|
|
||||||
|
if a match is found
|
||||||
|
return true
|
||||||
|
|
||||||
|
return false
|
||||||
|
|
||||||
|
if the file named by "CONSOLE" cannot be opened
|
||||||
|
return true
|
||||||
|
|
||||||
|
scan the file looking for a match between the input line
|
||||||
|
and the value of tty
|
||||||
|
|
||||||
|
if a match is found
|
||||||
|
return true
|
||||||
|
|
||||||
|
return false
|
||||||
@@ -62,11 +62,9 @@ You can either generate a single image by running the following command from
|
|||||||
the root folder of the project (i.e. Alpine):
|
the root folder of the project (i.e. Alpine):
|
||||||
|
|
||||||
```
|
```
|
||||||
ansible-playbook share/ansible/playbook.yml -i share/ansible/inventory.ini -e 'distribution=alpine'
|
docker build -f share/containers/alpine.dockerfile . --output build-out/alpine
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note**: you'll need to install ansible to run this automation.
|
|
||||||
|
|
||||||
Or generate all of the images with the `container-build.sh` script, as if you
|
Or generate all of the images with the `container-build.sh` script, as if you
|
||||||
were running some of the CI checks locally:
|
were running some of the CI checks locally:
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,6 @@ understand the project's development model:
|
|||||||
* [Build & install](build_install.md)
|
* [Build & install](build_install.md)
|
||||||
* [Coding style](coding_style.md)
|
* [Coding style](coding_style.md)
|
||||||
* [Tests](tests.md)
|
* [Tests](tests.md)
|
||||||
* [Continuous Integration](ci.md)
|
* [Continuous Integration](CI.md)
|
||||||
* [Releases](releases.md)
|
* [Releases](releases.md)
|
||||||
* [License](license.md)
|
* [License](license.md)
|
||||||
|
|||||||
@@ -1,22 +1,6 @@
|
|||||||
# Tests
|
# Tests
|
||||||
|
|
||||||
Currently, shadow provides unit and system tests.
|
Currently, shadow only provides system tests.
|
||||||
|
|
||||||
## Unit tests
|
|
||||||
|
|
||||||
Unit testing is provided by the [cmocka](https://cmocka.org/) framework. It's
|
|
||||||
recommended to read the
|
|
||||||
[basics](https://cmocka.org/talks/cmocka_unit_testing_and_mocking.pdf) and
|
|
||||||
[API](https://api.cmocka.org/) before writing any test case.
|
|
||||||
|
|
||||||
In addition, you can check [test_logind.c](../../tests/unit/test_logind.c) to
|
|
||||||
get a general idea on how to implement unit tests for shadow using cmocka.
|
|
||||||
|
|
||||||
You can execute unit tests by running:
|
|
||||||
|
|
||||||
```
|
|
||||||
make check
|
|
||||||
```
|
|
||||||
|
|
||||||
## System tests
|
## System tests
|
||||||
|
|
||||||
|
|||||||
@@ -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 '^#' |
|
||||||
@@ -227,6 +227,11 @@ PASS_WARN_AGE 7
|
|||||||
#
|
#
|
||||||
SU_WHEEL_ONLY no
|
SU_WHEEL_ONLY no
|
||||||
|
|
||||||
|
#
|
||||||
|
# If compiled with cracklib support, sets the path to the dictionaries
|
||||||
|
#
|
||||||
|
CRACKLIB_DICTPATH /var/cache/cracklib/cracklib_dict
|
||||||
|
|
||||||
#
|
#
|
||||||
# Min/max values for automatic uid selection in useradd(8)
|
# Min/max values for automatic uid selection in useradd(8)
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -2,20 +2,20 @@
|
|||||||
# and also cooperate to make a distribution for `make dist'
|
# and also cooperate to make a distribution for `make dist'
|
||||||
|
|
||||||
pamd_files = \
|
pamd_files = \
|
||||||
chpasswd \
|
|
||||||
chfn \
|
chfn \
|
||||||
chsh \
|
chsh \
|
||||||
groupmems \
|
groupmems \
|
||||||
login \
|
login \
|
||||||
newusers \
|
|
||||||
passwd
|
passwd
|
||||||
|
|
||||||
pamd_acct_tools_files = \
|
pamd_acct_tools_files = \
|
||||||
chage \
|
chage \
|
||||||
chgpasswd \
|
chgpasswd \
|
||||||
|
chpasswd \
|
||||||
groupadd \
|
groupadd \
|
||||||
groupdel \
|
groupdel \
|
||||||
groupmod \
|
groupmod \
|
||||||
|
newusers \
|
||||||
useradd \
|
useradd \
|
||||||
userdel \
|
userdel \
|
||||||
usermod
|
usermod
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,58 +0,0 @@
|
|||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
wc44x8aaET0FtmmJmRfxzQSEkczkR4AM
|
|
||||||
=K+Fs
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
=xU87
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
=2CmL
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
+15
-94
@@ -20,63 +20,17 @@ endif
|
|||||||
|
|
||||||
libshadow_la_CPPFLAGS += -I$(top_srcdir)
|
libshadow_la_CPPFLAGS += -I$(top_srcdir)
|
||||||
libshadow_la_CFLAGS = $(LIBBSD_CFLAGS) $(LIBCRYPT_PAM) $(LIBSYSTEMD)
|
libshadow_la_CFLAGS = $(LIBBSD_CFLAGS) $(LIBCRYPT_PAM) $(LIBSYSTEMD)
|
||||||
libshadow_la_LIBADD = $(LIBADD_DLOPEN)
|
|
||||||
|
|
||||||
libshadow_la_SOURCES = \
|
libshadow_la_SOURCES = \
|
||||||
addgrps.c \
|
addgrps.c \
|
||||||
adds.c \
|
|
||||||
adds.h \
|
|
||||||
age.c \
|
age.c \
|
||||||
agetpass.c \
|
agetpass.c \
|
||||||
agetpass.h \
|
alloc.c \
|
||||||
alloc/calloc.c \
|
alloc.h \
|
||||||
alloc/calloc.h \
|
|
||||||
alloc/malloc.c \
|
|
||||||
alloc/malloc.h \
|
|
||||||
alloc/realloc.c \
|
|
||||||
alloc/realloc.h \
|
|
||||||
alloc/reallocf.c \
|
|
||||||
alloc/reallocf.h \
|
|
||||||
alloc/x/xcalloc.c \
|
|
||||||
alloc/x/xcalloc.h \
|
|
||||||
alloc/x/xmalloc.c \
|
|
||||||
alloc/x/xmalloc.h \
|
|
||||||
alloc/x/xrealloc.c \
|
|
||||||
alloc/x/xrealloc.h \
|
|
||||||
atoi/a2i/a2i.c \
|
|
||||||
atoi/a2i/a2i.h \
|
|
||||||
atoi/a2i/a2s.c \
|
|
||||||
atoi/a2i/a2s.h \
|
|
||||||
atoi/a2i/a2s_c.c \
|
|
||||||
atoi/a2i/a2s_c.h \
|
|
||||||
atoi/a2i/a2s_nc.c \
|
|
||||||
atoi/a2i/a2s_nc.h \
|
|
||||||
atoi/a2i/a2u.c \
|
|
||||||
atoi/a2i/a2u.h \
|
|
||||||
atoi/a2i/a2u_c.c \
|
|
||||||
atoi/a2i/a2u_c.h \
|
|
||||||
atoi/a2i/a2u_nc.c \
|
|
||||||
atoi/a2i/a2u_nc.h \
|
|
||||||
atoi/getnum.c \
|
|
||||||
atoi/getnum.h \
|
|
||||||
atoi/str2i/str2i.c \
|
|
||||||
atoi/str2i/str2i.h \
|
|
||||||
atoi/str2i/str2s.c \
|
|
||||||
atoi/str2i/str2s.h \
|
|
||||||
atoi/str2i/str2u.c \
|
|
||||||
atoi/str2i/str2u.h \
|
|
||||||
atoi/strtoi/strtoi.c \
|
|
||||||
atoi/strtoi/strtoi.h \
|
|
||||||
atoi/strtoi/strtou.c \
|
|
||||||
atoi/strtoi/strtou.h \
|
|
||||||
atoi/strtoi/strtou_noneg.c \
|
|
||||||
atoi/strtoi/strtou_noneg.h \
|
|
||||||
attr.h \
|
|
||||||
audit_help.c \
|
audit_help.c \
|
||||||
basename.c \
|
basename.c \
|
||||||
bit.c \
|
bit.c \
|
||||||
bit.h \
|
bit.h \
|
||||||
cast.h \
|
|
||||||
chkname.c \
|
chkname.c \
|
||||||
chkname.h \
|
chkname.h \
|
||||||
chowndir.c \
|
chowndir.c \
|
||||||
@@ -89,32 +43,33 @@ libshadow_la_SOURCES = \
|
|||||||
console.c \
|
console.c \
|
||||||
copydir.c \
|
copydir.c \
|
||||||
csrand.c \
|
csrand.c \
|
||||||
|
date_to_str.c \
|
||||||
defines.h \
|
defines.h \
|
||||||
encrypt.c \
|
encrypt.c \
|
||||||
|
entry.c \
|
||||||
env.c \
|
env.c \
|
||||||
exitcodes.h \
|
exitcodes.h \
|
||||||
faillog.h \
|
faillog.h \
|
||||||
failure.c \
|
failure.c \
|
||||||
failure.h \
|
failure.h \
|
||||||
fd.c \
|
|
||||||
fields.c \
|
fields.c \
|
||||||
find_new_gid.c \
|
find_new_gid.c \
|
||||||
find_new_uid.c \
|
find_new_uid.c \
|
||||||
find_new_sub_gids.c \
|
find_new_sub_gids.c \
|
||||||
find_new_sub_uids.c \
|
find_new_sub_uids.c \
|
||||||
fputsx.c \
|
fputsx.c \
|
||||||
fs/readlink/areadlink.c \
|
get_gid.c \
|
||||||
fs/readlink/areadlink.h \
|
|
||||||
fs/readlink/readlinknul.c \
|
|
||||||
fs/readlink/readlinknul.h \
|
|
||||||
get_pid.c \
|
get_pid.c \
|
||||||
|
get_uid.c \
|
||||||
getdate.h \
|
getdate.h \
|
||||||
getdate.y \
|
getdate.y \
|
||||||
getdef.c \
|
getdef.c \
|
||||||
getdef.h \
|
getdef.h \
|
||||||
|
getlong.c \
|
||||||
getgr_nam_gid.c \
|
getgr_nam_gid.c \
|
||||||
getrange.c \
|
getrange.c \
|
||||||
gettime.c \
|
gettime.c \
|
||||||
|
getulong.c \
|
||||||
groupio.c \
|
groupio.c \
|
||||||
groupmem.c \
|
groupmem.c \
|
||||||
groupio.h \
|
groupio.h \
|
||||||
@@ -128,8 +83,9 @@ libshadow_la_SOURCES = \
|
|||||||
lockpw.c \
|
lockpw.c \
|
||||||
loginprompt.c \
|
loginprompt.c \
|
||||||
mail.c \
|
mail.c \
|
||||||
|
mempcpy.c \
|
||||||
|
mempcpy.h \
|
||||||
motd.c \
|
motd.c \
|
||||||
must_be.h \
|
|
||||||
myname.c \
|
myname.c \
|
||||||
nss.c \
|
nss.c \
|
||||||
nscd.c \
|
nscd.c \
|
||||||
@@ -151,6 +107,7 @@ libshadow_la_SOURCES = \
|
|||||||
pwdcheck.c \
|
pwdcheck.c \
|
||||||
pwmem.c \
|
pwmem.c \
|
||||||
remove_tree.c \
|
remove_tree.c \
|
||||||
|
rlogin.c \
|
||||||
root_flag.c \
|
root_flag.c \
|
||||||
run_part.h \
|
run_part.h \
|
||||||
run_part.c \
|
run_part.c \
|
||||||
@@ -172,55 +129,19 @@ libshadow_la_SOURCES = \
|
|||||||
shadowlog_internal.h \
|
shadowlog_internal.h \
|
||||||
shadowmem.c \
|
shadowmem.c \
|
||||||
shell.c \
|
shell.c \
|
||||||
sizeof.h \
|
|
||||||
spawn.c \
|
spawn.c \
|
||||||
sssd.c \
|
sssd.c \
|
||||||
sssd.h \
|
sssd.h \
|
||||||
string/memset/memzero.c \
|
stpecpy.c \
|
||||||
string/memset/memzero.h \
|
stpecpy.h \
|
||||||
string/sprintf/snprintf.c \
|
stpeprintf.c \
|
||||||
string/sprintf/snprintf.h \
|
stpeprintf.h \
|
||||||
string/sprintf/stpeprintf.c \
|
|
||||||
string/sprintf/stpeprintf.h \
|
|
||||||
string/sprintf/xasprintf.c \
|
|
||||||
string/sprintf/xasprintf.h \
|
|
||||||
string/strchr/strchrcnt.c \
|
|
||||||
string/strchr/strchrcnt.h \
|
|
||||||
string/strchr/stpspn.c \
|
|
||||||
string/strchr/stpspn.h \
|
|
||||||
string/strchr/strnul.c \
|
|
||||||
string/strchr/strnul.h \
|
|
||||||
string/strchr/strrspn.c \
|
|
||||||
string/strchr/strrspn.h \
|
|
||||||
string/strcmp/streq.c \
|
|
||||||
string/strcmp/streq.h \
|
|
||||||
string/strcpy/stpecpy.c \
|
|
||||||
string/strcpy/stpecpy.h \
|
|
||||||
string/strcpy/strncat.c \
|
|
||||||
string/strcpy/strncat.h \
|
|
||||||
string/strcpy/strncpy.c \
|
|
||||||
string/strcpy/strncpy.h \
|
|
||||||
string/strcpy/strtcpy.c \
|
|
||||||
string/strcpy/strtcpy.h \
|
|
||||||
string/strdup/strndupa.c \
|
|
||||||
string/strdup/strndupa.h \
|
|
||||||
string/strdup/xstrdup.c \
|
|
||||||
string/strdup/xstrdup.h \
|
|
||||||
string/strdup/xstrndup.c \
|
|
||||||
string/strdup/xstrndup.h \
|
|
||||||
string/strftime.c \
|
|
||||||
string/strftime.h \
|
|
||||||
string/strtok/stpsep.c \
|
|
||||||
string/strtok/stpsep.h \
|
|
||||||
strtoday.c \
|
strtoday.c \
|
||||||
sub.c \
|
sub.c \
|
||||||
subordinateio.h \
|
subordinateio.h \
|
||||||
subordinateio.c \
|
subordinateio.c \
|
||||||
sulog.c \
|
sulog.c \
|
||||||
time/day_to_str.c \
|
|
||||||
time/day_to_str.h \
|
|
||||||
ttytype.c \
|
ttytype.c \
|
||||||
typetraits.h \
|
|
||||||
tz.c \
|
tz.c \
|
||||||
ulimit.c \
|
ulimit.c \
|
||||||
user_busy.c \
|
user_busy.c \
|
||||||
|
|||||||
+11
-13
@@ -14,30 +14,28 @@
|
|||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <grp.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <grp.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include "alloc/malloc.h"
|
#include "alloc.h"
|
||||||
#include "alloc/reallocf.h"
|
|
||||||
#include "shadowlog.h"
|
#include "shadowlog.h"
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
|
#define SEP ",:"
|
||||||
/*
|
/*
|
||||||
* Add groups with names from LIST (separated by commas or colons)
|
* Add groups with names from LIST (separated by commas or colons)
|
||||||
* to the supplementary group set. Silently ignore groups which are
|
* to the supplementary group set. Silently ignore groups which are
|
||||||
* already there.
|
* already there. Warning: uses strtok().
|
||||||
*/
|
*/
|
||||||
int
|
int add_groups (const char *list)
|
||||||
add_groups(const char *list)
|
|
||||||
{
|
{
|
||||||
GETGROUPS_T *grouplist;
|
GETGROUPS_T *grouplist;
|
||||||
size_t i;
|
size_t i;
|
||||||
int ngroups;
|
int ngroups;
|
||||||
bool added;
|
bool added;
|
||||||
char *g, *p;
|
char *token;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int ret;
|
int ret;
|
||||||
FILE *shadow_logfd = log_get_logfd();
|
FILE *shadow_logfd = log_get_logfd();
|
||||||
@@ -72,13 +70,13 @@ add_groups(const char *list)
|
|||||||
}
|
}
|
||||||
|
|
||||||
added = false;
|
added = false;
|
||||||
p = buf;
|
for (token = strtok (buf, SEP); NULL != token; token = strtok (NULL, SEP)) {
|
||||||
while (NULL != (g = strsep(&p, ",:"))) {
|
|
||||||
struct group *grp;
|
struct group *grp;
|
||||||
|
|
||||||
grp = getgrnam(g); /* local, no need for xgetgrnam */
|
grp = getgrnam (token); /* local, no need for xgetgrnam */
|
||||||
if (NULL == grp) {
|
if (NULL == grp) {
|
||||||
fprintf(shadow_logfd, _("Warning: unknown group %s\n"), g);
|
fprintf (shadow_logfd, _("Warning: unknown group %s\n"),
|
||||||
|
token);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-15
@@ -1,15 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "adds.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern inline long addsl2(long a, long b);
|
|
||||||
extern inline long addslN(size_t n, long addend[n]);
|
|
||||||
|
|
||||||
extern inline int cmpl(const void *p1, const void *p2);
|
|
||||||
-86
@@ -1,86 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ADDS_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ADDS_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "sizeof.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define addsl(a, b, ...) \
|
|
||||||
({ \
|
|
||||||
long addend_[] = {a, b, __VA_ARGS__}; \
|
|
||||||
\
|
|
||||||
addslN(NITEMS(addend_), addend_); \
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
inline long addsl2(long a, long b);
|
|
||||||
inline long addslN(size_t n, long addend[n]);
|
|
||||||
|
|
||||||
inline int cmpl(const void *p1, const void *p2);
|
|
||||||
|
|
||||||
|
|
||||||
inline long
|
|
||||||
addsl2(long a, long b)
|
|
||||||
{
|
|
||||||
if (a > 0 && b > LONG_MAX - a) {
|
|
||||||
errno = EOVERFLOW;
|
|
||||||
return LONG_MAX;
|
|
||||||
}
|
|
||||||
if (a < 0 && b < LONG_MIN - a) {
|
|
||||||
errno = EOVERFLOW;
|
|
||||||
return LONG_MIN;
|
|
||||||
}
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline long
|
|
||||||
addslN(size_t n, long addend[n])
|
|
||||||
{
|
|
||||||
int e;
|
|
||||||
|
|
||||||
if (n == 0) {
|
|
||||||
errno = EDOM;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
e = errno;
|
|
||||||
while (n > 1) {
|
|
||||||
qsort(addend, n, sizeof(addend[0]), cmpl);
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
addend[0] = addsl2(addend[0], addend[--n]);
|
|
||||||
if (errno == EOVERFLOW)
|
|
||||||
return addend[0];
|
|
||||||
}
|
|
||||||
errno = e;
|
|
||||||
return addend[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
cmpl(const void *p1, const void *p2)
|
|
||||||
{
|
|
||||||
const long *l1 = p1;
|
|
||||||
const long *l2 = p2;
|
|
||||||
|
|
||||||
if (*l1 < *l2)
|
|
||||||
return -1;
|
|
||||||
if (*l1 > *l2)
|
|
||||||
return +1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -13,14 +13,11 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <pwd.h>
|
#include "prototypes.h"
|
||||||
#include <grp.h>
|
|
||||||
|
|
||||||
#include "adds.h"
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "exitcodes.h"
|
#include "exitcodes.h"
|
||||||
#include "prototypes.h"
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
@@ -142,7 +139,7 @@ int expire (const struct passwd *pw, /*@null@*/const struct spwd *sp)
|
|||||||
|
|
||||||
void agecheck (/*@null@*/const struct spwd *sp)
|
void agecheck (/*@null@*/const struct spwd *sp)
|
||||||
{
|
{
|
||||||
long now = time(NULL) / DAY;
|
long now = time(NULL) / SCALE;
|
||||||
long remain;
|
long remain;
|
||||||
|
|
||||||
if (NULL == sp) {
|
if (NULL == sp) {
|
||||||
@@ -165,9 +162,9 @@ void agecheck (/*@null@*/const struct spwd *sp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
remain = addsl(sp->sp_lstchg, sp->sp_max, -now);
|
remain = sp->sp_lstchg + sp->sp_max - now;
|
||||||
|
|
||||||
if (remain <= sp->sp_warn) {
|
if (remain <= sp->sp_warn) {
|
||||||
|
remain /= DAY / SCALE;
|
||||||
if (remain > 1) {
|
if (remain > 1) {
|
||||||
(void) printf (_("Your password will expire in %ld days.\n"),
|
(void) printf (_("Your password will expire in %ld days.\n"),
|
||||||
remain);
|
remain);
|
||||||
|
|||||||
+11
-22
@@ -7,27 +7,31 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include "agetpass.h"
|
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <readpassphrase.h>
|
#include <readpassphrase.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
#include "alloc/malloc.h"
|
#include "alloc.h"
|
||||||
|
#include "prototypes.h"
|
||||||
|
|
||||||
#if WITH_LIBBSD == 0
|
#if WITH_LIBBSD == 0
|
||||||
#include "freezero.h"
|
#include "freezero.h"
|
||||||
#endif /* WITH_LIBBSD */
|
#endif /* WITH_LIBBSD */
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(PASS_MAX)
|
||||||
|
#define PASS_MAX BUFSIZ - 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SYNOPSIS
|
* SYNOPSIS
|
||||||
* [[gnu::malloc(erase_pass)]]
|
* [[gnu::malloc(erase_pass)]]
|
||||||
* char *agetpass(const char *prompt);
|
* char *agetpass(const char *prompt);
|
||||||
* char *agetpass_stdin();
|
|
||||||
*
|
*
|
||||||
* void erase_pass(char *pass);
|
* void erase_pass(char *pass);
|
||||||
*
|
*
|
||||||
@@ -60,10 +64,6 @@
|
|||||||
* erased by calling erase_pass(), to avoid possibly leaking the
|
* erased by calling erase_pass(), to avoid possibly leaking the
|
||||||
* password.
|
* password.
|
||||||
*
|
*
|
||||||
* agetpass_stdin()
|
|
||||||
* This function is the same as previous one (agetpass). Just the
|
|
||||||
* password is read from stdin and terminal is not required.
|
|
||||||
*
|
|
||||||
* erase_pass()
|
* erase_pass()
|
||||||
* This function first clears the password, by calling
|
* This function first clears the password, by calling
|
||||||
* explicit_bzero(3) (or an equivalent call), and then frees the
|
* explicit_bzero(3) (or an equivalent call), and then frees the
|
||||||
@@ -92,8 +92,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
static char *
|
char *
|
||||||
agetpass_internal(const char *prompt, int flags)
|
agetpass(const char *prompt)
|
||||||
{
|
{
|
||||||
char *pass;
|
char *pass;
|
||||||
size_t len;
|
size_t len;
|
||||||
@@ -110,7 +110,7 @@ agetpass_internal(const char *prompt, int flags)
|
|||||||
if (pass == NULL)
|
if (pass == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (readpassphrase(prompt, pass, PASS_MAX + 2, flags) == NULL)
|
if (readpassphrase(prompt, pass, PASS_MAX + 2, RPP_REQUIRE_TTY) == NULL)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
len = strlen(pass);
|
len = strlen(pass);
|
||||||
@@ -126,17 +126,6 @@ fail:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
|
||||||
agetpass(const char *prompt)
|
|
||||||
{
|
|
||||||
return agetpass_internal(prompt, RPP_REQUIRE_TTY);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
agetpass_stdin()
|
|
||||||
{
|
|
||||||
return agetpass_internal(NULL, RPP_STDIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
erase_pass(char *pass)
|
erase_pass(char *pass)
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2022-2023, Alejandro Colomar <alx@kernel.org>
|
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_AGETPASS_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_AGETPASS_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
#include "defines.h"
|
|
||||||
|
|
||||||
|
|
||||||
void erase_pass(char *pass);
|
|
||||||
ATTR_MALLOC(erase_pass)
|
|
||||||
char *agetpass(const char *prompt);
|
|
||||||
char *agetpass_stdin();
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 1990 - 1994, Julianne Frances Haugh
|
||||||
|
* SPDX-FileCopyrightText: 1996 - 1998, Marek Michałkiewicz
|
||||||
|
* SPDX-FileCopyrightText: 2003 - 2006, Tomasz Kłoczko
|
||||||
|
* SPDX-FileCopyrightText: 2008 , Nicolas François
|
||||||
|
* SPDX-FileCopyrightText: 2023 , Alejandro Colomar <alx@kernel.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Replacements for malloc and strdup with error checking. Too trivial
|
||||||
|
to be worth copyrighting :-). I did that because a lot of code used
|
||||||
|
malloc and strdup without checking for NULL pointer, and I like some
|
||||||
|
message better than a core dump... --marekm
|
||||||
|
|
||||||
|
Yeh, but. Remember that bailing out might leave the system in some
|
||||||
|
bizarre state. You really want to put in error checking, then add
|
||||||
|
some back-out failure recovery code. -- jfh */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#ident "$Id$"
|
||||||
|
|
||||||
|
#include "alloc.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "prototypes.h"
|
||||||
|
#include "shadowlog.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern inline void *xmalloc(size_t size);
|
||||||
|
extern inline void *xmallocarray(size_t nmemb, size_t size);
|
||||||
|
extern inline void *mallocarray(size_t nmemb, size_t size);
|
||||||
|
extern inline void *reallocarrayf(void *p, size_t nmemb, size_t size);
|
||||||
|
extern inline char *xstrdup(const char *str);
|
||||||
|
|
||||||
|
|
||||||
|
void *
|
||||||
|
xcalloc(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
p = calloc(nmemb, size);
|
||||||
|
if (p == NULL)
|
||||||
|
goto x;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
|
||||||
|
x:
|
||||||
|
fprintf(log_get_logfd(), _("%s: %s\n"),
|
||||||
|
log_get_progname(), strerror(errno));
|
||||||
|
exit(13);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void *
|
||||||
|
xreallocarray(void *p, size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
p = reallocarrayf(p, nmemb, size);
|
||||||
|
if (p == NULL)
|
||||||
|
goto x;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
|
||||||
|
x:
|
||||||
|
fprintf(log_get_logfd(), _("%s: %s\n"),
|
||||||
|
log_get_progname(), strerror(errno));
|
||||||
|
exit(13);
|
||||||
|
}
|
||||||
+115
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SHADOW_INCLUDE_LIB_MALLOC_H_
|
||||||
|
#define SHADOW_INCLUDE_LIB_MALLOC_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define CALLOC(n, type) ((type *) calloc(n, sizeof(type)))
|
||||||
|
#define XCALLOC(n, type) ((type *) xcalloc(n, sizeof(type)))
|
||||||
|
#define MALLOC(n, type) ((type *) mallocarray(n, sizeof(type)))
|
||||||
|
#define XMALLOC(n, type) ((type *) xmallocarray(n, sizeof(type)))
|
||||||
|
|
||||||
|
#define REALLOC(ptr, n, type) \
|
||||||
|
({ \
|
||||||
|
__auto_type p_ = (ptr); \
|
||||||
|
\
|
||||||
|
static_assert(__builtin_types_compatible_p(typeof(p_), type *), ""); \
|
||||||
|
\
|
||||||
|
(type *) reallocarray(p_, n, sizeof(type)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define REALLOCF(ptr, n, type) \
|
||||||
|
({ \
|
||||||
|
__auto_type p_ = (ptr); \
|
||||||
|
\
|
||||||
|
static_assert(__builtin_types_compatible_p(typeof(p_), type *), ""); \
|
||||||
|
\
|
||||||
|
(type *) reallocarrayf(p_, n, sizeof(type)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define XREALLOC(ptr, n, type) \
|
||||||
|
({ \
|
||||||
|
__auto_type p_ = (ptr); \
|
||||||
|
\
|
||||||
|
static_assert(__builtin_types_compatible_p(typeof(p_), type *), ""); \
|
||||||
|
\
|
||||||
|
(type *) xreallocarray(p_, n, sizeof(type)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline void *xmalloc(size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline void *xmallocarray(size_t nmemb, size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline void *mallocarray(size_t nmemb, size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline void *reallocarrayf(void *p, size_t nmemb, size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
inline char *xstrdup(const char *str);
|
||||||
|
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
void *xcalloc(size_t nmemb, size_t size);
|
||||||
|
ATTR_MALLOC(free)
|
||||||
|
void *xreallocarray(void *p, size_t nmemb, size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
xmalloc(size_t size)
|
||||||
|
{
|
||||||
|
return xmallocarray(1, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
xmallocarray(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
return xreallocarray(NULL, nmemb, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
mallocarray(size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
return reallocarray(NULL, nmemb, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void *
|
||||||
|
reallocarrayf(void *p, size_t nmemb, size_t size)
|
||||||
|
{
|
||||||
|
void *q;
|
||||||
|
|
||||||
|
q = reallocarray(p, nmemb, size);
|
||||||
|
|
||||||
|
/* realloc(p, 0) is equivalent to free(p); avoid double free. */
|
||||||
|
if (q == NULL && nmemb != 0 && size != 0)
|
||||||
|
free(p);
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline char *
|
||||||
|
xstrdup(const char *str)
|
||||||
|
{
|
||||||
|
return strcpy(XMALLOC(strlen(str) + 1, char), str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // include guard
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
|
||||||
// SPDX-FileCopyrightText: 1996-1998, Marek Michałkiewicz
|
|
||||||
// SPDX-FileCopyrightText: 2003-2006, Tomasz Kłoczko
|
|
||||||
// SPDX-FileCopyrightText: 2008 , Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "alloc/calloc.h"
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ALLOC_CALLOC_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ALLOC_CALLOC_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define CALLOC(n, type) \
|
|
||||||
( \
|
|
||||||
(type *) calloc(n, sizeof(type)) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
|
||||||
// SPDX-FileCopyrightText: 1996-1998, Marek Michałkiewicz
|
|
||||||
// SPDX-FileCopyrightText: 2003-2006, Tomasz Kłoczko
|
|
||||||
// SPDX-FileCopyrightText: 2008 , Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "alloc/malloc.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern inline void *mallocarray(size_t nmemb, size_t size);
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ALLOC_MALLOC_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ALLOC_MALLOC_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define MALLOC(n, type) \
|
|
||||||
( \
|
|
||||||
(type *) mallocarray(n, sizeof(type)) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_ALLOC_SIZE(1, 2)
|
|
||||||
ATTR_MALLOC(free)
|
|
||||||
inline void *mallocarray(size_t nmemb, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
inline void *
|
|
||||||
mallocarray(size_t nmemb, size_t size)
|
|
||||||
{
|
|
||||||
return reallocarray(NULL, nmemb, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
|
||||||
// SPDX-FileCopyrightText: 1996-1998, Marek Michałkiewicz
|
|
||||||
// SPDX-FileCopyrightText: 2003-2006, Tomasz Kłoczko
|
|
||||||
// SPDX-FileCopyrightText: 2008 , Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "alloc/realloc.h"
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ALLOC_REALLOC_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ALLOC_REALLOC_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define REALLOC(p, n, type) \
|
|
||||||
( \
|
|
||||||
_Generic(p, type *: (type *) reallocarray(p, (n) ?: 1, sizeof(type))) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
|
||||||
// SPDX-FileCopyrightText: 1996-1998, Marek Michałkiewicz
|
|
||||||
// SPDX-FileCopyrightText: 2003-2006, Tomasz Kłoczko
|
|
||||||
// SPDX-FileCopyrightText: 2008 , Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "alloc/reallocf.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern inline void *reallocarrayf(void *p, size_t nmemb, size_t size);
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ALLOC_REALLOCF_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ALLOC_REALLOCF_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define REALLOCF(p, n, type) \
|
|
||||||
( \
|
|
||||||
_Generic(p, type *: (type *) reallocarrayf(p, (n) ?: 1, sizeof(type)))\
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_ALLOC_SIZE(2, 3)
|
|
||||||
ATTR_MALLOC(free)
|
|
||||||
inline void *reallocarrayf(void *p, size_t nmemb, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
inline void *
|
|
||||||
reallocarrayf(void *p, size_t nmemb, size_t size)
|
|
||||||
{
|
|
||||||
void *q;
|
|
||||||
|
|
||||||
q = reallocarray(p, nmemb ?: 1, size ?: 1);
|
|
||||||
|
|
||||||
if (q == NULL)
|
|
||||||
free(p);
|
|
||||||
return q;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
|
||||||
// SPDX-FileCopyrightText: 1996-1998, Marek Michałkiewicz
|
|
||||||
// SPDX-FileCopyrightText: 2003-2006, Tomasz Kłoczko
|
|
||||||
// SPDX-FileCopyrightText: 2008 , Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "alloc/x/xcalloc.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "defines.h"
|
|
||||||
#include "shadowlog.h"
|
|
||||||
|
|
||||||
|
|
||||||
void *
|
|
||||||
xcalloc(size_t nmemb, size_t size)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
p = calloc(nmemb, size);
|
|
||||||
if (p == NULL)
|
|
||||||
goto x;
|
|
||||||
|
|
||||||
return p;
|
|
||||||
|
|
||||||
x:
|
|
||||||
fprintf(log_get_logfd(), _("%s: %s\n"),
|
|
||||||
log_get_progname(), strerror(errno));
|
|
||||||
exit(13);
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ALLOC_X_XCALLOC_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ALLOC_X_XCALLOC_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define XCALLOC(n, type) \
|
|
||||||
( \
|
|
||||||
(type *) xcalloc(n, sizeof(type)) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_ALLOC_SIZE(1, 2)
|
|
||||||
ATTR_MALLOC(free)
|
|
||||||
void *xcalloc(size_t nmemb, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
|
||||||
// SPDX-FileCopyrightText: 1996-1998, Marek Michałkiewicz
|
|
||||||
// SPDX-FileCopyrightText: 2003-2006, Tomasz Kłoczko
|
|
||||||
// SPDX-FileCopyrightText: 2008 , Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "alloc/x/xmalloc.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern inline void *xmallocarray(size_t nmemb, size_t size);
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ALLOC_X_XMALLOC_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ALLOC_X_XMALLOC_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "alloc/x/xrealloc.h"
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define XMALLOC(n, type) \
|
|
||||||
( \
|
|
||||||
(type *) xmallocarray(n, sizeof(type)) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_ALLOC_SIZE(1, 2)
|
|
||||||
ATTR_MALLOC(free)
|
|
||||||
inline void *xmallocarray(size_t nmemb, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
inline void *
|
|
||||||
xmallocarray(size_t nmemb, size_t size)
|
|
||||||
{
|
|
||||||
return xreallocarray(NULL, nmemb, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
|
||||||
// SPDX-FileCopyrightText: 1996-1998, Marek Michałkiewicz
|
|
||||||
// SPDX-FileCopyrightText: 2003-2006, Tomasz Kłoczko
|
|
||||||
// SPDX-FileCopyrightText: 2008 , Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "alloc/x/xrealloc.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "alloc/reallocf.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "shadowlog.h"
|
|
||||||
|
|
||||||
|
|
||||||
void *
|
|
||||||
xreallocarray(void *p, size_t nmemb, size_t size)
|
|
||||||
{
|
|
||||||
p = reallocarrayf(p, nmemb, size);
|
|
||||||
if (p == NULL)
|
|
||||||
goto x;
|
|
||||||
|
|
||||||
return p;
|
|
||||||
|
|
||||||
x:
|
|
||||||
fprintf(log_get_logfd(), _("%s: %s\n"),
|
|
||||||
log_get_progname(), strerror(errno));
|
|
||||||
exit(13);
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_MALLOC_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_MALLOC_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define XREALLOC(ptr, n, type) \
|
|
||||||
( \
|
|
||||||
_Generic(ptr, type *: (type *) xreallocarray(ptr, n, sizeof(type))) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_ALLOC_SIZE(2, 3)
|
|
||||||
ATTR_MALLOC(free)
|
|
||||||
void *xreallocarray(void *p, size_t nmemb, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2i.h"
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_A2I_A2I_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_A2I_A2I_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2s_c.h"
|
|
||||||
#include "atoi/a2i/a2s_nc.h"
|
|
||||||
#include "atoi/a2i/a2u_c.h"
|
|
||||||
#include "atoi/a2i/a2u_nc.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See the manual of these macros in liba2i's documentation:
|
|
||||||
* <http://www.alejandro-colomar.es/share/dist/liba2i/git/HEAD/liba2i-HEAD.pdf>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define a2i(TYPE, n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic((void (*)(TYPE, typeof(s))) 0, \
|
|
||||||
void (*)(short, const char *): a2sh_c, \
|
|
||||||
void (*)(short, const void *): a2sh_c, \
|
|
||||||
void (*)(short, char *): a2sh_nc, \
|
|
||||||
void (*)(short, void *): a2sh_nc, \
|
|
||||||
void (*)(int, const char *): a2si_c, \
|
|
||||||
void (*)(int, const void *): a2si_c, \
|
|
||||||
void (*)(int, char *): a2si_nc, \
|
|
||||||
void (*)(int, void *): a2si_nc, \
|
|
||||||
void (*)(long, const char *): a2sl_c, \
|
|
||||||
void (*)(long, const void *): a2sl_c, \
|
|
||||||
void (*)(long, char *): a2sl_nc, \
|
|
||||||
void (*)(long, void *): a2sl_nc, \
|
|
||||||
void (*)(long long, const char *): a2sll_c, \
|
|
||||||
void (*)(long long, const void *): a2sll_c, \
|
|
||||||
void (*)(long long, char *): a2sll_nc, \
|
|
||||||
void (*)(long long, void *): a2sll_nc, \
|
|
||||||
void (*)(unsigned short, const char *): a2uh_c, \
|
|
||||||
void (*)(unsigned short, const void *): a2uh_c, \
|
|
||||||
void (*)(unsigned short, char *): a2uh_nc, \
|
|
||||||
void (*)(unsigned short, void *): a2uh_nc, \
|
|
||||||
void (*)(unsigned int, const char *): a2ui_c, \
|
|
||||||
void (*)(unsigned int, const void *): a2ui_c, \
|
|
||||||
void (*)(unsigned int, char *): a2ui_nc, \
|
|
||||||
void (*)(unsigned int, void *): a2ui_nc, \
|
|
||||||
void (*)(unsigned long, const char *): a2ul_c, \
|
|
||||||
void (*)(unsigned long, const void *): a2ul_c, \
|
|
||||||
void (*)(unsigned long, char *): a2ul_nc, \
|
|
||||||
void (*)(unsigned long, void *): a2ul_nc, \
|
|
||||||
void (*)(unsigned long long, const char *): a2ull_c, \
|
|
||||||
void (*)(unsigned long long, const void *): a2ull_c, \
|
|
||||||
void (*)(unsigned long long, char *): a2ull_nc, \
|
|
||||||
void (*)(unsigned long long, void *): a2ull_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2s.h"
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_A2I_A2S_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_A2I_A2S_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2s_c.h"
|
|
||||||
#include "atoi/a2i/a2s_nc.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define a2sh(n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic(s, \
|
|
||||||
const char *: a2sh_c, \
|
|
||||||
const void *: a2sh_c, \
|
|
||||||
char *: a2sh_nc, \
|
|
||||||
void *: a2sh_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define a2si(n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic(s, \
|
|
||||||
const char *: a2si_c, \
|
|
||||||
const void *: a2si_c, \
|
|
||||||
char *: a2si_nc, \
|
|
||||||
void *: a2si_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define a2sl(n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic(s, \
|
|
||||||
const char *: a2sl_c, \
|
|
||||||
const void *: a2sl_c, \
|
|
||||||
char *: a2sl_nc, \
|
|
||||||
void *: a2sl_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define a2sll(n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic(s, \
|
|
||||||
const char *: a2sll_c, \
|
|
||||||
const void *: a2sll_c, \
|
|
||||||
char *: a2sll_nc, \
|
|
||||||
void *: a2sll_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2s_c.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern inline int a2sh_c(short *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, short min, short max);
|
|
||||||
extern inline int a2si_c(int *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, int min, int max);
|
|
||||||
extern inline int a2sl_c(long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, long min, long max);
|
|
||||||
extern inline int a2sll_c(long long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, long long min, long long max);
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_A2I_A2S_C_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_A2I_A2S_C_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2s_nc.h"
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2sh_c(short *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, short min, short max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2si_c(int *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, int min, int max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2sl_c(long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, long min, long max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2sll_c(long long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, long long min, long long max);
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2sh_c(short *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, short min, short max)
|
|
||||||
{
|
|
||||||
return a2sh_nc(n, (char *) s, (char **) endp, base, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2si_c(int *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, int min, int max)
|
|
||||||
{
|
|
||||||
return a2si_nc(n, (char *) s, (char **) endp, base, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2sl_c(long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, long min, long max)
|
|
||||||
{
|
|
||||||
return a2sl_nc(n, (char *) s, (char **) endp, base, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2sll_c(long long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, long long min, long long max)
|
|
||||||
{
|
|
||||||
return a2sll_nc(n, (char *) s, (char **) endp, base, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2s_nc.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern inline int a2sh_nc(short *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, short min, short max);
|
|
||||||
extern inline int a2si_nc(int *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, int min, int max);
|
|
||||||
extern inline int a2sl_nc(long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, long min, long max);
|
|
||||||
extern inline int a2sll_nc(long long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, long long min, long long max);
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_A2I_A2S_NC_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_A2I_A2S_NC_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include "atoi/strtoi/strtoi.h"
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2sh_nc(short *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, short min, short max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2si_nc(int *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, int min, int max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2sl_nc(long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, long min, long max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2sll_nc(long long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, long long min, long long max);
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2sh_nc(short *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, short min, short max)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
*n = strtoi_(s, endp, base, min, max, &status);
|
|
||||||
if (status != 0) {
|
|
||||||
errno = status;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2si_nc(int *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, int min, int max)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
*n = strtoi_(s, endp, base, min, max, &status);
|
|
||||||
if (status != 0) {
|
|
||||||
errno = status;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2sl_nc(long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, long min, long max)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
*n = strtoi_(s, endp, base, min, max, &status);
|
|
||||||
if (status != 0) {
|
|
||||||
errno = status;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2sll_nc(long long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, long long min, long long max)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
*n = strtoi_(s, endp, base, min, max, &status);
|
|
||||||
if (status != 0) {
|
|
||||||
errno = status;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2u.h"
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_A2I_A2U_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_A2I_A2U_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2u_c.h"
|
|
||||||
#include "atoi/a2i/a2u_nc.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define a2uh(n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic(s, \
|
|
||||||
const char *: a2uh_c, \
|
|
||||||
const void *: a2uh_c, \
|
|
||||||
char *: a2uh_nc, \
|
|
||||||
void *: a2uh_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define a2ui(n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic(s, \
|
|
||||||
const char *: a2ui_c, \
|
|
||||||
const void *: a2ui_c, \
|
|
||||||
char *: a2ui_nc, \
|
|
||||||
void *: a2ui_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define a2ul(n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic(s, \
|
|
||||||
const char *: a2ul_c, \
|
|
||||||
const void *: a2ul_c, \
|
|
||||||
char *: a2ul_nc, \
|
|
||||||
void *: a2ul_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define a2ull(n, s, ...) \
|
|
||||||
( \
|
|
||||||
_Generic(s, \
|
|
||||||
const char *: a2ull_c, \
|
|
||||||
const void *: a2ull_c, \
|
|
||||||
char *: a2ull_nc, \
|
|
||||||
void *: a2ull_nc \
|
|
||||||
)(n, s, __VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2u_c.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern inline int a2uh_c(unsigned short *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned short min,
|
|
||||||
unsigned short max);
|
|
||||||
extern inline int a2ui_c(unsigned int *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned int min, unsigned int max);
|
|
||||||
extern inline int a2ul_c(unsigned long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned long min, unsigned long max);
|
|
||||||
extern inline int a2ull_c(unsigned long long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned long long min,
|
|
||||||
unsigned long long max);
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_A2I_A2U_C_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_A2I_A2U_C_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2u_nc.h"
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2uh_c(unsigned short *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned short min,
|
|
||||||
unsigned short max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2ui_c(unsigned int *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned int min, unsigned int max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2ul_c(unsigned long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned long min, unsigned long max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2ull_c(unsigned long long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned long long min,
|
|
||||||
unsigned long long max);
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2uh_c(unsigned short *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned short min,
|
|
||||||
unsigned short max)
|
|
||||||
{
|
|
||||||
return a2uh_nc(n, (char *) s, (char **) endp, base, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2ui_c(unsigned int *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned int min, unsigned int max)
|
|
||||||
{
|
|
||||||
return a2ui_nc(n, (char *) s, (char **) endp, base, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2ul_c(unsigned long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned long min, unsigned long max)
|
|
||||||
{
|
|
||||||
return a2ul_nc(n, (char *) s, (char **) endp, base, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2ull_c(unsigned long long *restrict n, const char *s,
|
|
||||||
const char **restrict endp, int base, unsigned long long min,
|
|
||||||
unsigned long long max)
|
|
||||||
{
|
|
||||||
return a2ull_nc(n, (char *) s, (char **) endp, base, min, max);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2u_nc.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern inline int a2uh_nc(unsigned short *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned short min, unsigned short max);
|
|
||||||
extern inline int a2ui_nc(unsigned int *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned int min, unsigned int max);
|
|
||||||
extern inline int a2ul_nc(unsigned long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned long min, unsigned long max);
|
|
||||||
extern inline int a2ull_nc(unsigned long long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned long long min,
|
|
||||||
unsigned long long max);
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_A2I_A2U_NC_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_A2I_A2U_NC_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include "atoi/strtoi/strtou_noneg.h"
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2uh_nc(unsigned short *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned short min, unsigned short max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2ui_nc(unsigned int *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned int min, unsigned int max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2ul_nc(unsigned long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned long min, unsigned long max);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1) ATTR_ACCESS(write_only, 3)
|
|
||||||
inline int a2ull_nc(unsigned long long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned long long min,
|
|
||||||
unsigned long long max);
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2uh_nc(unsigned short *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned short min,
|
|
||||||
unsigned short max)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
*n = strtou_noneg(s, endp, base, min, max, &status);
|
|
||||||
if (status != 0) {
|
|
||||||
errno = status;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2ui_nc(unsigned int *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned int min, unsigned int max)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
*n = strtou_noneg(s, endp, base, min, max, &status);
|
|
||||||
if (status != 0) {
|
|
||||||
errno = status;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2ul_nc(unsigned long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned long min, unsigned long max)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
*n = strtou_noneg(s, endp, base, min, max, &status);
|
|
||||||
if (status != 0) {
|
|
||||||
errno = status;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
a2ull_nc(unsigned long long *restrict n, char *s,
|
|
||||||
char **restrict endp, int base, unsigned long long min,
|
|
||||||
unsigned long long max)
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
*n = strtou_noneg(s, endp, base, min, max, &status);
|
|
||||||
if (status != 0) {
|
|
||||||
errno = status;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2009, Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "atoi/getnum.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern inline int get_fd(const char *restrict fdstr, int *restrict fd);
|
|
||||||
extern inline int get_gid(const char *restrict gidstr, gid_t *restrict gid);
|
|
||||||
extern inline int get_pid(const char *restrict pidstr, pid_t *restrict pid);
|
|
||||||
extern inline int get_uid(const char *restrict uidstr, uid_t *restrict uid);
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2009, Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_GETNUM_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_GETNUM_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2i.h"
|
|
||||||
#include "atoi/a2i/a2s.h"
|
|
||||||
#include "attr.h"
|
|
||||||
#include "typetraits.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(1) ATTR_ACCESS(write_only, 2)
|
|
||||||
inline int get_fd(const char *restrict fdstr, int *restrict fd);
|
|
||||||
ATTR_STRING(1) ATTR_ACCESS(write_only, 2)
|
|
||||||
inline int get_gid(const char *restrict gidstr, gid_t *restrict gid);
|
|
||||||
ATTR_STRING(1) ATTR_ACCESS(write_only, 2)
|
|
||||||
inline int get_pid(const char *restrict pidstr, pid_t *restrict pid);
|
|
||||||
ATTR_STRING(1) ATTR_ACCESS(write_only, 2)
|
|
||||||
inline int get_uid(const char *restrict uidstr, uid_t *restrict uid);
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
get_fd(const char *restrict fdstr, int *restrict fd)
|
|
||||||
{
|
|
||||||
return a2si(fd, fdstr, NULL, 10, 0, INT_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
get_gid(const char *restrict gidstr, gid_t *restrict gid)
|
|
||||||
{
|
|
||||||
return a2i(gid_t, gid, gidstr, NULL, 10, type_min(gid_t), type_max(gid_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
get_pid(const char *restrict pidstr, pid_t *restrict pid)
|
|
||||||
{
|
|
||||||
return a2i(pid_t, pid, pidstr, NULL, 10, 1, type_max(pid_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
get_uid(const char *restrict uidstr, uid_t *restrict uid)
|
|
||||||
{
|
|
||||||
return a2i(uid_t, uid, uidstr, NULL, 10, type_min(uid_t), type_max(uid_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2007-2009, Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/str2i/str2i.h"
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2007-2009, Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_STR2I_STR2I_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_STR2I_STR2I_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/str2i/str2s.h"
|
|
||||||
#include "atoi/str2i/str2u.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define str2i(TYPE, ...) \
|
|
||||||
( \
|
|
||||||
_Generic((TYPE) 0, \
|
|
||||||
short: str2sh, \
|
|
||||||
int: str2si, \
|
|
||||||
long: str2sl, \
|
|
||||||
long long: str2sll, \
|
|
||||||
unsigned short: str2uh, \
|
|
||||||
unsigned int: str2ui, \
|
|
||||||
unsigned long: str2ul, \
|
|
||||||
unsigned long long: str2ull \
|
|
||||||
)(__VA_ARGS__) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2007-2009, Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/str2i/str2s.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern inline int str2sh(short *restrict n, const char *restrict s);
|
|
||||||
extern inline int str2si(int *restrict n, const char *restrict s);
|
|
||||||
extern inline int str2sl(long *restrict n, const char *restrict s);
|
|
||||||
extern inline int str2sll(long long *restrict n, const char *restrict s);
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2007-2009, Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_STR2I_STR2S_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_STR2I_STR2S_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2s.h"
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
|
||||||
inline int str2sh(short *restrict n, const char *restrict s);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
|
||||||
inline int str2si(int *restrict n, const char *restrict s);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
|
||||||
inline int str2sl(long *restrict n, const char *restrict s);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
|
||||||
inline int str2sll(long long *restrict n, const char *restrict s);
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
str2sh(short *restrict n, const char *restrict s)
|
|
||||||
{
|
|
||||||
return a2sh(n, s, NULL, 0, SHRT_MIN, SHRT_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
str2si(int *restrict n, const char *restrict s)
|
|
||||||
{
|
|
||||||
return a2si(n, s, NULL, 0, INT_MIN, INT_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
str2sl(long *restrict n, const char *restrict s)
|
|
||||||
{
|
|
||||||
return a2sl(n, s, NULL, 0, LONG_MIN, LONG_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
str2sll(long long *restrict n, const char *restrict s)
|
|
||||||
{
|
|
||||||
return a2sll(n, s, NULL, 0, LLONG_MIN, LLONG_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2007-2009, Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/str2i/str2u.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern inline int str2uh(unsigned short *restrict n, const char *restrict s);
|
|
||||||
extern inline int str2ui(unsigned int *restrict n, const char *restrict s);
|
|
||||||
extern inline int str2ul(unsigned long *restrict n, const char *restrict s);
|
|
||||||
extern inline int str2ull(unsigned long long *restrict n, const char *restrict s);
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2007-2009, Nicolas François
|
|
||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_STR2I_STR2U_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_STR2I_STR2U_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "atoi/a2i/a2u.h"
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
|
||||||
inline int str2uh(unsigned short *restrict n, const char *restrict s);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
|
||||||
inline int str2ui(unsigned int *restrict n, const char *restrict s);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
|
||||||
inline int str2ul(unsigned long *restrict n, const char *restrict s);
|
|
||||||
ATTR_STRING(2) ATTR_ACCESS(write_only, 1)
|
|
||||||
inline int str2ull(unsigned long long *restrict n, const char *restrict s);
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
str2uh(unsigned short *restrict n, const char *restrict s)
|
|
||||||
{
|
|
||||||
return a2uh(n, s, NULL, 0, 0, USHRT_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
str2ui(unsigned int *restrict n, const char *restrict s)
|
|
||||||
{
|
|
||||||
return a2ui(n, s, NULL, 0, 0, UINT_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
str2ul(unsigned long *restrict n, const char *restrict s)
|
|
||||||
{
|
|
||||||
return a2ul(n, s, NULL, 0, 0, ULONG_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline int
|
|
||||||
str2ull(unsigned long long *restrict n, const char *restrict s)
|
|
||||||
{
|
|
||||||
return a2ull(n, s, NULL, 0, 0, ULLONG_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/strtoi/strtoi.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern inline intmax_t strtoi_(const char *s, char **restrict endp, int base,
|
|
||||||
intmax_t min, intmax_t max, int *restrict status);
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_STRTOI_STRTOI_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_STRTOI_STRTOI_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(1) ATTR_ACCESS(write_only, 2) ATTR_ACCESS(write_only, 6)
|
|
||||||
inline intmax_t strtoi_(const char *s, char **restrict endp, int base,
|
|
||||||
intmax_t min, intmax_t max, int *restrict status);
|
|
||||||
|
|
||||||
|
|
||||||
inline intmax_t
|
|
||||||
strtoi_(const char *s, char **restrict endp, int base,
|
|
||||||
intmax_t min, intmax_t max, int *restrict status)
|
|
||||||
{
|
|
||||||
int e, st;
|
|
||||||
char *end;
|
|
||||||
intmax_t n;
|
|
||||||
|
|
||||||
if (endp == NULL)
|
|
||||||
endp = &end;
|
|
||||||
if (status == NULL)
|
|
||||||
status = &st;
|
|
||||||
|
|
||||||
if (base != 0 && (base < 2 || base > 36)) {
|
|
||||||
*status = EINVAL;
|
|
||||||
return MAX(min, MIN(max, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
e = errno;
|
|
||||||
errno = 0;
|
|
||||||
|
|
||||||
n = strtoimax(s, endp, base);
|
|
||||||
|
|
||||||
if (*endp == s)
|
|
||||||
*status = ECANCELED;
|
|
||||||
else if (errno == ERANGE || n < min || n > max)
|
|
||||||
*status = ERANGE;
|
|
||||||
else if (**endp != '\0')
|
|
||||||
*status = ENOTSUP;
|
|
||||||
else
|
|
||||||
*status = 0;
|
|
||||||
|
|
||||||
errno = e;
|
|
||||||
|
|
||||||
return MAX(min, MIN(max, n));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/strtoi/strtou.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern inline uintmax_t strtou_(const char *s, char **restrict endp, int base,
|
|
||||||
uintmax_t min, uintmax_t max, int *restrict status);
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_STRTOI_STRTOU_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_STRTOI_STRTOU_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(1) ATTR_ACCESS(write_only, 2) ATTR_ACCESS(write_only, 6)
|
|
||||||
inline uintmax_t strtou_(const char *s, char **restrict endp, int base,
|
|
||||||
uintmax_t min, uintmax_t max, int *restrict status);
|
|
||||||
|
|
||||||
|
|
||||||
inline uintmax_t
|
|
||||||
strtou_(const char *s, char **restrict endp, int base,
|
|
||||||
uintmax_t min, uintmax_t max, int *restrict status)
|
|
||||||
{
|
|
||||||
int e, st;
|
|
||||||
char *end;
|
|
||||||
uintmax_t n;
|
|
||||||
|
|
||||||
if (endp == NULL)
|
|
||||||
endp = &end;
|
|
||||||
if (status == NULL)
|
|
||||||
status = &st;
|
|
||||||
|
|
||||||
if (base != 0 && (base < 2 || base > 36)) {
|
|
||||||
*status = EINVAL;
|
|
||||||
return MAX(min, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
e = errno;
|
|
||||||
errno = 0;
|
|
||||||
|
|
||||||
n = strtoumax(s, endp, base);
|
|
||||||
|
|
||||||
if (*endp == s)
|
|
||||||
*status = ECANCELED;
|
|
||||||
else if (errno == ERANGE || n < min || n > max)
|
|
||||||
*status = ERANGE;
|
|
||||||
else if (**endp != '\0')
|
|
||||||
*status = ENOTSUP;
|
|
||||||
else
|
|
||||||
*status = 0;
|
|
||||||
|
|
||||||
errno = e;
|
|
||||||
|
|
||||||
return MAX(min, MIN(max, n));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "atoi/strtoi/strtou_noneg.h"
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern inline uintmax_t strtou_noneg(const char *s, char **restrict endp,
|
|
||||||
int base, uintmax_t min, uintmax_t max, int *restrict status);
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2023-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_ATOI_STRTOI_STRTOU_NONEG_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATOI_STRTOI_STRTOU_NONEG_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "atoi/strtoi/strtoi.h"
|
|
||||||
#include "atoi/strtoi/strtou.h"
|
|
||||||
#include "attr.h"
|
|
||||||
|
|
||||||
|
|
||||||
ATTR_STRING(1) ATTR_ACCESS(write_only, 2) ATTR_ACCESS(write_only, 6)
|
|
||||||
inline uintmax_t strtou_noneg(const char *s, char **restrict endp,
|
|
||||||
int base, uintmax_t min, uintmax_t max, int *restrict status);
|
|
||||||
|
|
||||||
|
|
||||||
inline uintmax_t
|
|
||||||
strtou_noneg(const char *s, char **restrict endp, int base,
|
|
||||||
uintmax_t min, uintmax_t max, int *restrict status)
|
|
||||||
{
|
|
||||||
int st;
|
|
||||||
|
|
||||||
if (status == NULL)
|
|
||||||
status = &st;
|
|
||||||
if (strtoi_(s, endp, base, 0, 1, status) == 0 && *status == ERANGE)
|
|
||||||
return min;
|
|
||||||
|
|
||||||
return strtou_(s, endp, base, min, max, status);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
-35
@@ -1,35 +0,0 @@
|
|||||||
#ifndef SHADOW_INCLUDE_LIB_ATTR_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_ATTR_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
|
|
||||||
#if (__GNUC__ >= 10)
|
|
||||||
# define MAYBE_UNUSED [[gnu::unused]]
|
|
||||||
# define NORETURN [[gnu::__noreturn__]]
|
|
||||||
# define format_attr(type, fmt, va) [[gnu::format(type, fmt, va)]]
|
|
||||||
# define ATTR_ACCESS(...) [[gnu::access(__VA_ARGS__)]]
|
|
||||||
# define ATTR_ALLOC_SIZE(...) [[gnu::alloc_size(__VA_ARGS__)]]
|
|
||||||
#else
|
|
||||||
# define MAYBE_UNUSED
|
|
||||||
# define NORETURN
|
|
||||||
# define format_attr(type, fmt, va)
|
|
||||||
# define ATTR_ACCESS(...)
|
|
||||||
# define ATTR_ALLOC_SIZE(...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__GNUC__ >= 11) && !defined(__clang__)
|
|
||||||
# define ATTR_MALLOC(deallocator) [[gnu::malloc(deallocator)]]
|
|
||||||
#else
|
|
||||||
# define ATTR_MALLOC(deallocator)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (__GNUC__ >= 14)
|
|
||||||
# define ATTR_STRING(i) [[gnu::null_terminated_string_arg(i)]]
|
|
||||||
#else
|
|
||||||
# define ATTR_STRING(i)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
+1
-3
@@ -21,8 +21,6 @@
|
|||||||
#include <libaudit.h>
|
#include <libaudit.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "shadowlog.h"
|
#include "shadowlog.h"
|
||||||
int audit_fd;
|
int audit_fd;
|
||||||
@@ -56,7 +54,7 @@ void audit_help_open (void)
|
|||||||
* id - uid or gid that the operation is being performed on. This is used
|
* id - uid or gid that the operation is being performed on. This is used
|
||||||
* only when user is NULL.
|
* only when user is NULL.
|
||||||
*/
|
*/
|
||||||
void audit_logger (int type, MAYBE_UNUSED const char *pgname, const char *op,
|
void audit_logger (int type, unused const char *pgname, const char *op,
|
||||||
const char *name, unsigned int id,
|
const char *name, unsigned int id,
|
||||||
shadow_audit_result result)
|
shadow_audit_result result)
|
||||||
{
|
{
|
||||||
|
|||||||
-15
@@ -1,15 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022-2024, Alejandro Colomar <alx@kernel.org>
|
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SHADOW_INCLUDE_LIB_CAST_H_
|
|
||||||
#define SHADOW_INCLUDE_LIB_CAST_H_
|
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define const_cast(T, p) _Generic(p, const T: (T) (p))
|
|
||||||
|
|
||||||
|
|
||||||
#endif // include guard
|
|
||||||
+24
-67
@@ -1,10 +1,11 @@
|
|||||||
// SPDX-FileCopyrightText: 1990-1994, Julianne Frances Haugh
|
/*
|
||||||
// SPDX-FileCopyrightText: 1996-2000, Marek Michałkiewicz
|
* SPDX-FileCopyrightText: 1990 - 1994, Julianne Frances Haugh
|
||||||
// SPDX-FileCopyrightText: 2001-2005, Tomasz Kłoczko
|
* SPDX-FileCopyrightText: 1996 - 2000, Marek Michałkiewicz
|
||||||
// SPDX-FileCopyrightText: 2005-2008, Nicolas François
|
* SPDX-FileCopyrightText: 2001 - 2005, Tomasz Kłoczko
|
||||||
// SPDX-FileCopyrightText: 2023-2025, Alejandro Colomar <alx@kernel.org>
|
* SPDX-FileCopyrightText: 2005 - 2008, Nicolas François
|
||||||
// SPDX-License-Identifier: BSD-3-Clause
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* is_valid_user_name(), is_valid_group_name() - check the new user/group
|
* is_valid_user_name(), is_valid_group_name() - check the new user/group
|
||||||
@@ -12,59 +13,27 @@
|
|||||||
* return values:
|
* return values:
|
||||||
* true - OK
|
* true - OK
|
||||||
* false - bad name
|
* false - bad name
|
||||||
* errors:
|
|
||||||
* EINVAL Invalid name characters or sequences
|
|
||||||
* EOVERFLOW Name longer than maximum size
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "chkname.h"
|
#include "chkname.h"
|
||||||
#include "string/strcmp/streq.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LOGIN_NAME_MAX
|
|
||||||
# define LOGIN_NAME_MAX 256
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
int allow_bad_names = false;
|
int allow_bad_names = false;
|
||||||
|
|
||||||
|
static bool is_valid_name (const char *name)
|
||||||
size_t
|
|
||||||
login_name_max_size(void)
|
|
||||||
{
|
|
||||||
long conf;
|
|
||||||
|
|
||||||
conf = sysconf(_SC_LOGIN_NAME_MAX);
|
|
||||||
if (conf == -1)
|
|
||||||
return LOGIN_NAME_MAX;
|
|
||||||
|
|
||||||
return conf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool
|
|
||||||
is_valid_name(const char *name)
|
|
||||||
{
|
{
|
||||||
if (allow_bad_names) {
|
if (allow_bad_names) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* User/group names must match BRE regex:
|
* User/group names must match gnu e-regex:
|
||||||
* [a-zA-Z0-9_.][a-zA-Z0-9_.-]*$\?
|
* [a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?
|
||||||
*
|
*
|
||||||
* as a non-POSIX, extension, allow "$" as the last char for
|
* as a non-POSIX, extension, allow "$" as the last char for
|
||||||
* sake of Samba 3.x "add machine script"
|
* sake of Samba 3.x "add machine script"
|
||||||
@@ -80,15 +49,13 @@ is_valid_name(const char *name)
|
|||||||
(*name >= 'A' && *name <= 'Z') ||
|
(*name >= 'A' && *name <= 'Z') ||
|
||||||
(*name >= '0' && *name <= '9') ||
|
(*name >= '0' && *name <= '9') ||
|
||||||
*name == '_' ||
|
*name == '_' ||
|
||||||
*name == '.'))
|
*name == '.')) {
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
numeric = isdigit(*name);
|
numeric = isdigit(*name);
|
||||||
|
|
||||||
while (!streq(++name, "")) {
|
while ('\0' != *++name) {
|
||||||
if (!((*name >= 'a' && *name <= 'z') ||
|
if (!((*name >= 'a' && *name <= 'z') ||
|
||||||
(*name >= 'A' && *name <= 'Z') ||
|
(*name >= 'A' && *name <= 'Z') ||
|
||||||
(*name >= '0' && *name <= '9') ||
|
(*name >= '0' && *name <= '9') ||
|
||||||
@@ -96,48 +63,38 @@ is_valid_name(const char *name)
|
|||||||
*name == '.' ||
|
*name == '.' ||
|
||||||
*name == '-' ||
|
*name == '-' ||
|
||||||
(*name == '$' && name[1] == '\0')
|
(*name == '$' && name[1] == '\0')
|
||||||
))
|
)) {
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
numeric &= isdigit(*name);
|
numeric &= isdigit(*name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numeric) {
|
return !numeric;
|
||||||
errno = EINVAL;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_valid_user_name (const char *name)
|
||||||
bool
|
|
||||||
is_valid_user_name(const char *name)
|
|
||||||
{
|
{
|
||||||
if (strlen(name) >= login_name_max_size()) {
|
/*
|
||||||
errno = EOVERFLOW;
|
* User names length are limited by the kernel
|
||||||
|
*/
|
||||||
|
if (strlen (name) > sysconf(_SC_LOGIN_NAME_MAX)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return is_valid_name(name);
|
return is_valid_name (name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_valid_group_name (const char *name)
|
||||||
bool
|
|
||||||
is_valid_group_name(const char *name)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Arbitrary limit for group names.
|
* Arbitrary limit for group names.
|
||||||
* HP-UX 10 limits to 16 characters
|
* HP-UX 10 limits to 16 characters
|
||||||
*/
|
*/
|
||||||
if ( (GROUP_NAME_MAX_LENGTH > 0)
|
if ( (GROUP_NAME_MAX_LENGTH > 0)
|
||||||
&& (strlen (name) > GROUP_NAME_MAX_LENGTH))
|
&& (strlen (name) > GROUP_NAME_MAX_LENGTH)) {
|
||||||
{
|
|
||||||
errno = EOVERFLOW;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return is_valid_name (name);
|
return is_valid_name (name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-8
@@ -11,7 +11,6 @@
|
|||||||
#ifndef _CHKNAME_H_
|
#ifndef _CHKNAME_H_
|
||||||
#define _CHKNAME_H_
|
#define _CHKNAME_H_
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* is_valid_user_name(), is_valid_group_name() - check the new user/group
|
* is_valid_user_name(), is_valid_group_name() - check the new user/group
|
||||||
* name for validity;
|
* name for validity;
|
||||||
@@ -20,14 +19,8 @@
|
|||||||
* false - bad name
|
* false - bad name
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
|
|
||||||
extern size_t login_name_max_size(void);
|
|
||||||
extern bool is_valid_user_name (const char *name);
|
extern bool is_valid_user_name (const char *name);
|
||||||
extern bool is_valid_group_name (const char *name);
|
extern bool is_valid_group_name (const char *name);
|
||||||
|
|
||||||
|
|||||||
+4
-7
@@ -13,15 +13,12 @@
|
|||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include "prototypes.h"
|
||||||
|
#include "defines.h"
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "defines.h"
|
|
||||||
#include "prototypes.h"
|
|
||||||
#include "string/strcmp/streq.h"
|
|
||||||
|
|
||||||
|
|
||||||
static int chown_tree_at (int at_fd,
|
static int chown_tree_at (int at_fd,
|
||||||
const char *path,
|
const char *path,
|
||||||
uid_t old_uid,
|
uid_t old_uid,
|
||||||
@@ -59,8 +56,8 @@ static int chown_tree_at (int at_fd,
|
|||||||
/*
|
/*
|
||||||
* Skip the "." and ".." entries
|
* Skip the "." and ".." entries
|
||||||
*/
|
*/
|
||||||
if ( streq(ent->d_name, ".")
|
if ( (strcmp (ent->d_name, ".") == 0)
|
||||||
|| streq(ent->d_name, "..")) {
|
|| (strcmp (ent->d_name, "..") == 0)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -44,7 +44,7 @@ void do_cleanups (void)
|
|||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
/* Make sure there were no overflows */
|
/* Make sure there were no overflow */
|
||||||
assert (NULL == cleanup_functions[CLEANUP_FUNCTIONS-1]);
|
assert (NULL == cleanup_functions[CLEANUP_FUNCTIONS-1]);
|
||||||
|
|
||||||
if (getpid () != cleanup_pid) {
|
if (getpid () != cleanup_pid) {
|
||||||
|
|||||||
+2
-3
@@ -9,7 +9,6 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "groupio.h"
|
#include "groupio.h"
|
||||||
#include "sgroupio.h"
|
#include "sgroupio.h"
|
||||||
@@ -179,7 +178,7 @@ void cleanup_report_del_group_gshadow (void *group_name)
|
|||||||
*
|
*
|
||||||
* It should be registered after the group file is successfully locked.
|
* It should be registered after the group file is successfully locked.
|
||||||
*/
|
*/
|
||||||
void cleanup_unlock_group (MAYBE_UNUSED void *arg)
|
void cleanup_unlock_group (unused void *arg)
|
||||||
{
|
{
|
||||||
if (gr_unlock () == 0) {
|
if (gr_unlock () == 0) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
@@ -199,7 +198,7 @@ void cleanup_unlock_group (MAYBE_UNUSED void *arg)
|
|||||||
*
|
*
|
||||||
* It should be registered after the gshadow file is successfully locked.
|
* It should be registered after the gshadow file is successfully locked.
|
||||||
*/
|
*/
|
||||||
void cleanup_unlock_gshadow (MAYBE_UNUSED void *arg)
|
void cleanup_unlock_gshadow (unused void *arg)
|
||||||
{
|
{
|
||||||
if (sgr_unlock () == 0) {
|
if (sgr_unlock () == 0) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
|
|||||||
+2
-3
@@ -9,7 +9,6 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "pwio.h"
|
#include "pwio.h"
|
||||||
#include "shadowio.h"
|
#include "shadowio.h"
|
||||||
@@ -96,7 +95,7 @@ void cleanup_report_add_user_shadow (void *user_name)
|
|||||||
*
|
*
|
||||||
* It should be registered after the passwd database is successfully locked.
|
* It should be registered after the passwd database is successfully locked.
|
||||||
*/
|
*/
|
||||||
void cleanup_unlock_passwd (MAYBE_UNUSED void *arg)
|
void cleanup_unlock_passwd (unused void *arg)
|
||||||
{
|
{
|
||||||
if (pw_unlock () == 0) {
|
if (pw_unlock () == 0) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
@@ -115,7 +114,7 @@ void cleanup_unlock_passwd (MAYBE_UNUSED void *arg)
|
|||||||
*
|
*
|
||||||
* It should be registered after the shadow database is successfully locked.
|
* It should be registered after the shadow database is successfully locked.
|
||||||
*/
|
*/
|
||||||
void cleanup_unlock_shadow (MAYBE_UNUSED void *arg)
|
void cleanup_unlock_shadow (unused void *arg)
|
||||||
{
|
{
|
||||||
if (spw_unlock () == 0) {
|
if (spw_unlock () == 0) {
|
||||||
fprintf (log_get_logfd(),
|
fprintf (log_get_logfd(),
|
||||||
|
|||||||
+69
-66
@@ -11,34 +11,26 @@
|
|||||||
|
|
||||||
#ident "$Id$"
|
#ident "$Id$"
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include "alloc/malloc.h"
|
#include "alloc.h"
|
||||||
#include "alloc/reallocf.h"
|
|
||||||
#include "atoi/getnum.h"
|
|
||||||
#include "commonio.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "nscd.h"
|
#include "nscd.h"
|
||||||
|
#include "sssd.h"
|
||||||
#ifdef WITH_TCB
|
#ifdef WITH_TCB
|
||||||
#include <tcb.h>
|
#include <tcb.h>
|
||||||
#endif /* WITH_TCB */
|
#endif /* WITH_TCB */
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
|
#include "commonio.h"
|
||||||
#include "shadowlog_internal.h"
|
#include "shadowlog_internal.h"
|
||||||
#include "sssd.h"
|
|
||||||
#include "string/memset/memzero.h"
|
|
||||||
#include "string/sprintf/snprintf.h"
|
|
||||||
#include "string/strcmp/streq.h"
|
|
||||||
#include "string/strtok/stpsep.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static int lrename (const char *, const char *);
|
static int lrename (const char *, const char *);
|
||||||
@@ -116,9 +108,9 @@ static int check_link_count (const char *file, bool log)
|
|||||||
|
|
||||||
if (sb.st_nlink != 2) {
|
if (sb.st_nlink != 2) {
|
||||||
if (log) {
|
if (log) {
|
||||||
fprintf(shadow_logfd,
|
(void) fprintf (shadow_logfd,
|
||||||
"%s: %s: lock file already used (nlink: %ju)\n",
|
"%s: %s: lock file already used (nlink: %u)\n",
|
||||||
shadow_progname, file, (uintmax_t) sb.st_nlink);
|
shadow_progname, file, sb.st_nlink);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -129,11 +121,11 @@ static int check_link_count (const char *file, bool log)
|
|||||||
|
|
||||||
static int do_lock_file (const char *file, const char *lock, bool log)
|
static int do_lock_file (const char *file, const char *lock, bool log)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
int retval;
|
pid_t pid;
|
||||||
char buf[32];
|
ssize_t len;
|
||||||
pid_t pid;
|
int retval;
|
||||||
ssize_t len;
|
char buf[32];
|
||||||
|
|
||||||
fd = open (file, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
fd = open (file, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
||||||
if (-1 == fd) {
|
if (-1 == fd) {
|
||||||
@@ -146,9 +138,9 @@ static int do_lock_file (const char *file, const char *lock, bool log)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pid = getpid ();
|
pid = getpid ();
|
||||||
SNPRINTF(buf, "%lu", (unsigned long) pid);
|
snprintf (buf, sizeof buf, "%lu", (unsigned long) pid);
|
||||||
len = (ssize_t) strlen (buf) + 1;
|
len = (ssize_t) strlen (buf) + 1;
|
||||||
if (write_full(fd, buf, len) == -1) {
|
if (write_full (fd, buf, (size_t) len) != len) {
|
||||||
if (log) {
|
if (log) {
|
||||||
(void) fprintf (shadow_logfd,
|
(void) fprintf (shadow_logfd,
|
||||||
"%s: %s file write error: %s\n",
|
"%s: %s file write error: %s\n",
|
||||||
@@ -199,8 +191,8 @@ static int do_lock_file (const char *file, const char *lock, bool log)
|
|||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
stpcpy(&buf[len], "");
|
buf[len] = '\0';
|
||||||
if (get_pid(buf, &pid) == -1) {
|
if (get_pid (buf, &pid) == 0) {
|
||||||
if (log) {
|
if (log) {
|
||||||
(void) fprintf (shadow_logfd,
|
(void) fprintf (shadow_logfd,
|
||||||
"%s: existing lock file %s with an invalid PID '%s'\n",
|
"%s: existing lock file %s with an invalid PID '%s'\n",
|
||||||
@@ -347,7 +339,7 @@ static void free_linked_list (struct commonio_db *db)
|
|||||||
|
|
||||||
int commonio_setname (struct commonio_db *db, const char *name)
|
int commonio_setname (struct commonio_db *db, const char *name)
|
||||||
{
|
{
|
||||||
SNPRINTF(db->filename, "%s", name);
|
snprintf (db->filename, sizeof (db->filename), "%s", name);
|
||||||
db->setname = true;
|
db->setname = true;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -361,25 +353,33 @@ bool commonio_present (const struct commonio_db *db)
|
|||||||
|
|
||||||
int commonio_lock_nowait (struct commonio_db *db, bool log)
|
int commonio_lock_nowait (struct commonio_db *db, bool log)
|
||||||
{
|
{
|
||||||
int err = 0;
|
char* file = NULL;
|
||||||
char *file = NULL;
|
char* lock = NULL;
|
||||||
char *lock = NULL;
|
size_t lock_file_len;
|
||||||
|
size_t file_len;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
if (db->locked) {
|
if (db->locked) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
file_len = strlen(db->filename) + 11;/* %lu max size */
|
||||||
if (asprintf(&file, "%s.%ju", db->filename, (uintmax_t) getpid()) == -1)
|
lock_file_len = strlen(db->filename) + 6; /* sizeof ".lock" */
|
||||||
|
file = MALLOC(file_len, char);
|
||||||
|
if (file == NULL) {
|
||||||
goto cleanup_ENOMEM;
|
goto cleanup_ENOMEM;
|
||||||
if (asprintf(&lock, "%s.lock", db->filename) == -1)
|
}
|
||||||
|
lock = MALLOC(lock_file_len, char);
|
||||||
|
if (lock == NULL) {
|
||||||
goto cleanup_ENOMEM;
|
goto cleanup_ENOMEM;
|
||||||
|
}
|
||||||
|
snprintf (file, file_len, "%s.%lu",
|
||||||
|
db->filename, (unsigned long) getpid ());
|
||||||
|
snprintf (lock, lock_file_len, "%s.lock", db->filename);
|
||||||
if (do_lock_file (file, lock, log) != 0) {
|
if (do_lock_file (file, lock, log) != 0) {
|
||||||
db->locked = true;
|
db->locked = true;
|
||||||
lock_count++;
|
lock_count++;
|
||||||
err = 1;
|
err = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup_ENOMEM:
|
cleanup_ENOMEM:
|
||||||
free(file);
|
free(file);
|
||||||
free(lock);
|
free(lock);
|
||||||
@@ -473,7 +473,7 @@ static void dec_lock_count (void)
|
|||||||
|
|
||||||
int commonio_unlock (struct commonio_db *db)
|
int commonio_unlock (struct commonio_db *db)
|
||||||
{
|
{
|
||||||
char lock[1029];
|
char lock[1024];
|
||||||
|
|
||||||
if (db->isopen) {
|
if (db->isopen) {
|
||||||
db->readonly = true;
|
db->readonly = true;
|
||||||
@@ -490,7 +490,7 @@ int commonio_unlock (struct commonio_db *db)
|
|||||||
* then call ulckpwdf() (if used) on last unlock.
|
* then call ulckpwdf() (if used) on last unlock.
|
||||||
*/
|
*/
|
||||||
db->locked = false;
|
db->locked = false;
|
||||||
SNPRINTF(lock, "%s.lock", db->filename);
|
snprintf (lock, sizeof lock, "%s.lock", db->filename);
|
||||||
unlink (lock);
|
unlink (lock);
|
||||||
dec_lock_count ();
|
dec_lock_count ();
|
||||||
return 1;
|
return 1;
|
||||||
@@ -578,7 +578,9 @@ static void add_one_entry_nis (struct commonio_db *db,
|
|||||||
int commonio_open (struct commonio_db *db, int mode)
|
int commonio_open (struct commonio_db *db, int mode)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
|
char *cp;
|
||||||
char *line;
|
char *line;
|
||||||
|
struct commonio_entry *p;
|
||||||
void *eptr = NULL;
|
void *eptr = NULL;
|
||||||
int flags = mode;
|
int flags = mode;
|
||||||
size_t buflen;
|
size_t buflen;
|
||||||
@@ -639,21 +641,21 @@ int commonio_open (struct commonio_db *db, int mode)
|
|||||||
|
|
||||||
buflen = BUFLEN;
|
buflen = BUFLEN;
|
||||||
buf = MALLOC(buflen, char);
|
buf = MALLOC(buflen, char);
|
||||||
if (NULL == buf)
|
if (NULL == buf) {
|
||||||
goto cleanup_errno;
|
goto cleanup_ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
while (db->ops->fgets (buf, buflen, db->fp) == buf) {
|
while (db->ops->fgets (buf, buflen, db->fp) == buf) {
|
||||||
struct commonio_entry *p;
|
while ( ((cp = strrchr (buf, '\n')) == NULL)
|
||||||
|
|
||||||
while ( (strrchr (buf, '\n') == NULL)
|
|
||||||
&& (feof (db->fp) == 0)) {
|
&& (feof (db->fp) == 0)) {
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
buflen += BUFLEN;
|
buflen += BUFLEN;
|
||||||
buf = REALLOCF(buf, buflen, char);
|
cp = REALLOC(buf, buflen, char);
|
||||||
if (NULL == buf)
|
if (NULL == cp) {
|
||||||
goto cleanup_errno;
|
goto cleanup_buf;
|
||||||
|
}
|
||||||
|
buf = cp;
|
||||||
len = strlen (buf);
|
len = strlen (buf);
|
||||||
if (db->ops->fgets (buf + len,
|
if (db->ops->fgets (buf + len,
|
||||||
(int) (buflen - len),
|
(int) (buflen - len),
|
||||||
@@ -661,7 +663,10 @@ int commonio_open (struct commonio_db *db, int mode)
|
|||||||
goto cleanup_buf;
|
goto cleanup_buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stpsep(buf, "\n");
|
cp = strrchr (buf, '\n');
|
||||||
|
if (NULL != cp) {
|
||||||
|
*cp = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
line = strdup (buf);
|
line = strdup (buf);
|
||||||
if (NULL == line) {
|
if (NULL == line) {
|
||||||
@@ -713,6 +718,7 @@ int commonio_open (struct commonio_db *db, int mode)
|
|||||||
free (line);
|
free (line);
|
||||||
cleanup_buf:
|
cleanup_buf:
|
||||||
free (buf);
|
free (buf);
|
||||||
|
cleanup_ENOMEM:
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
cleanup_errno:
|
cleanup_errno:
|
||||||
saved_errno = errno;
|
saved_errno = errno;
|
||||||
@@ -831,8 +837,10 @@ int commonio_sort_wrt (struct commonio_db *shadow,
|
|||||||
if (NULL == spw_ptr->eptr) {
|
if (NULL == spw_ptr->eptr) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (streq(name, shadow->ops->getname(spw_ptr->eptr)))
|
if (strcmp (name, shadow->ops->getname (spw_ptr->eptr))
|
||||||
|
== 0) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (NULL == spw_ptr) {
|
if (NULL == spw_ptr) {
|
||||||
continue;
|
continue;
|
||||||
@@ -891,9 +899,9 @@ static int write_all (const struct commonio_db *db)
|
|||||||
|
|
||||||
int commonio_close (struct commonio_db *db)
|
int commonio_close (struct commonio_db *db)
|
||||||
{
|
{
|
||||||
int errors = 0;
|
char buf[1024];
|
||||||
char buf[1024];
|
int errors = 0;
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
|
|
||||||
if (!db->isopen) {
|
if (!db->isopen) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
@@ -924,11 +932,7 @@ int commonio_close (struct commonio_db *db)
|
|||||||
/*
|
/*
|
||||||
* Create backup file.
|
* Create backup file.
|
||||||
*/
|
*/
|
||||||
if (SNPRINTF(buf, "%s-", db->filename) == -1) {
|
snprintf (buf, sizeof buf, "%s-", db->filename);
|
||||||
(void) fclose (db->fp);
|
|
||||||
db->fp = NULL;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
if (set_selinux_file_context (db->filename, S_IFREG) != 0) {
|
if (set_selinux_file_context (db->filename, S_IFREG) != 0) {
|
||||||
@@ -943,15 +947,15 @@ int commonio_close (struct commonio_db *db)
|
|||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
db->fp = NULL;
|
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
if (reset_selinux_file_context () != 0) {
|
if (reset_selinux_file_context () != 0) {
|
||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (errors != 0)
|
if (errors != 0) {
|
||||||
|
db->fp = NULL;
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Default permissions for new [g]shadow files.
|
* Default permissions for new [g]shadow files.
|
||||||
@@ -961,8 +965,7 @@ int commonio_close (struct commonio_db *db)
|
|||||||
sb.st_gid = db->st_gid;
|
sb.st_gid = db->st_gid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SNPRINTF(buf, "%s+", db->filename) == -1)
|
snprintf (buf, sizeof buf, "%s+", db->filename);
|
||||||
goto fail;
|
|
||||||
|
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
if (set_selinux_file_context (db->filename, S_IFREG) != 0) {
|
if (set_selinux_file_context (db->filename, S_IFREG) != 0) {
|
||||||
@@ -1033,7 +1036,7 @@ static /*@dependent@*/ /*@null@*/struct commonio_entry *next_entry_by_name (
|
|||||||
for (p = pos; NULL != p; p = p->next) {
|
for (p = pos; NULL != p; p = p->next) {
|
||||||
ep = p->eptr;
|
ep = p->eptr;
|
||||||
if ( (NULL != ep)
|
if ( (NULL != ep)
|
||||||
&& streq(db->ops->getname(ep), name)) {
|
&& (strcmp (db->ops->getname (ep), name) == 0)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1239,7 +1242,7 @@ int commonio_rewind (struct commonio_db *db)
|
|||||||
|
|
||||||
if (!db->isopen) {
|
if (!db->isopen) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return NULL;
|
return 0;
|
||||||
}
|
}
|
||||||
if (NULL == db->cursor) {
|
if (NULL == db->cursor) {
|
||||||
db->cursor = db->head;
|
db->cursor = db->head;
|
||||||
|
|||||||
+2
-7
@@ -11,11 +11,8 @@
|
|||||||
#ifndef COMMONIO_H
|
#ifndef COMMONIO_H
|
||||||
#define COMMONIO_H
|
#define COMMONIO_H
|
||||||
|
|
||||||
|
|
||||||
#include "attr.h"
|
|
||||||
#include "defines.h" /* bool */
|
#include "defines.h" /* bool */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Linked list entry.
|
* Linked list entry.
|
||||||
*/
|
*/
|
||||||
@@ -40,7 +37,7 @@ struct commonio_ops {
|
|||||||
/*
|
/*
|
||||||
* free() the object including any strings pointed by it.
|
* free() the object including any strings pointed by it.
|
||||||
*/
|
*/
|
||||||
void (*free)(/*@only@*/void *);
|
void (*free) (/*@out@*/ /*@only@*/void *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the name of the object (for example, pw_name
|
* Return the name of the object (for example, pw_name
|
||||||
@@ -64,9 +61,7 @@ struct commonio_ops {
|
|||||||
* fgets and fputs (can be replaced by versions that
|
* fgets and fputs (can be replaced by versions that
|
||||||
* understand line continuation conventions).
|
* understand line continuation conventions).
|
||||||
*/
|
*/
|
||||||
ATTR_ACCESS(write_only, 1, 2)
|
/*@null@*/char *(*fgets) (/*@returned@*/ /*@out@*/char *s, int n, FILE *stream);
|
||||||
/*@null@*/char *(*fgets)(/*@returned@*/char *restrict s, int n,
|
|
||||||
FILE *restrict stream);
|
|
||||||
int (*fputs) (const char *, FILE *);
|
int (*fputs) (const char *, FILE *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user