1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-30 14:55:37 +03:00

Merge pull request #8468 from fbuihuu/sysusers-support-nis

Sysusers support nis

Fixes #8467.
This commit is contained in:
Yu Watanabe 2018-03-18 19:57:18 +09:00 committed by GitHub
commit ef5018515a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 69 additions and 8 deletions

View File

@ -396,6 +396,7 @@ static const char* default_shell(uid_t uid) {
static int write_temporary_passwd(const char *passwd_path, FILE **tmpfile, char **tmpfile_path) {
_cleanup_fclose_ FILE *original = NULL, *passwd = NULL;
_cleanup_(unlink_and_freep) char *passwd_tmp = NULL;
struct passwd *pw = NULL;
Iterator iterator;
Item *i;
int r;
@ -409,7 +410,6 @@ static int write_temporary_passwd(const char *passwd_path, FILE **tmpfile, char
original = fopen(passwd_path, "re");
if (original) {
struct passwd *pw;
r = sync_rights(original, passwd);
if (r < 0)
@ -429,6 +429,10 @@ static int write_temporary_passwd(const char *passwd_path, FILE **tmpfile, char
return -EEXIST;
}
/* Make sure we keep the NIS entries (if any) at the end. */
if (IN_SET(pw->pw_name[0], '+', '-'))
break;
errno = 0;
if (putpwent(pw, passwd) < 0)
return errno ? -errno : -EIO;
@ -468,6 +472,17 @@ static int write_temporary_passwd(const char *passwd_path, FILE **tmpfile, char
return errno ? -errno : -EIO;
}
/* Append the remaining NIS entries if any */
while (pw) {
errno = 0;
if (putpwent(pw, passwd) < 0)
return errno ? -errno : -EIO;
pw = fgetpwent(original);
}
if (!IN_SET(errno, 0, ENOENT))
return -errno;
r = fflush_and_check(passwd);
if (r < 0)
return r;
@ -567,6 +582,7 @@ static int write_temporary_group(const char *group_path, FILE **tmpfile, char **
_cleanup_fclose_ FILE *original = NULL, *group = NULL;
_cleanup_(unlink_and_freep) char *group_tmp = NULL;
bool group_changed = false;
struct group *gr = NULL;
Iterator iterator;
Item *i;
int r;
@ -580,7 +596,6 @@ static int write_temporary_group(const char *group_path, FILE **tmpfile, char **
original = fopen(group_path, "re");
if (original) {
struct group *gr;
r = sync_rights(original, group);
if (r < 0)
@ -604,6 +619,10 @@ static int write_temporary_group(const char *group_path, FILE **tmpfile, char **
return -EEXIST;
}
/* Make sure we keep the NIS entries (if any) at the end. */
if (IN_SET(gr->gr_name[0], '+', '-'))
break;
r = putgrent_with_members(gr, group);
if (r < 0)
return r;
@ -636,6 +655,17 @@ static int write_temporary_group(const char *group_path, FILE **tmpfile, char **
group_changed = true;
}
/* Append the remaining NIS entries if any */
while (gr) {
errno = 0;
if (putgrent(gr, group) != 0)
return errno > 0 ? -errno : -EIO;
gr = fgetgrent(original);
}
if (!IN_SET(errno, 0, ENOENT))
return -errno;
r = fflush_sync_and_check(group);
if (r < 0)
return r;

View File

@ -0,0 +1,6 @@
o1:x:100:
g1:x:111:
u1:x:222:
+giant:::bill,tina,alan,hetty
-transport:::
+:::

View File

@ -0,0 +1,6 @@
root:x:0:0:root:/root:/bin/bash
systemd-network:x:492:492:Systemd Network Management:/:/usr/sbin/nologin
systemd-resolve:x:491:491:Systemd Resolver:/:/usr/sbin/nologin
systemd-timesync:x:493:493:Systemd Time Synchronization:/:/usr/sbin/nologin
u1:x:222:222::/:/sbin/nologin
+::::::

View File

@ -0,0 +1,4 @@
o1:x:100
+giant:::bill,tina,alan,hetty
-transport:::
+:::

View File

@ -0,0 +1,5 @@
root:x:0:0:root:/root:/bin/bash
systemd-network:x:492:492:Systemd Network Management:/:/usr/sbin/nologin
systemd-resolve:x:491:491:Systemd Resolver:/:/usr/sbin/nologin
systemd-timesync:x:493:493:Systemd Time Synchronization:/:/usr/sbin/nologin
+::::::

View File

@ -0,0 +1,3 @@
#Type Name ID GECOS HOMEDIR
u u1 222 - -
g g1 111 - -

View File

@ -10,6 +10,13 @@ test_setup() {
mkdir -p $TESTDIR/etc/sysusers.d $TESTDIR/usr/lib/sysusers.d $TESTDIR/tmp
}
prepare_testdir() {
rm -f $TESTDIR/etc/*{passwd,group,shadow}
for i in $1.initial-{passwd,group,shadow}; do
test -f $i && cp $i $TESTDIR/etc/${i#*.initial-}
done
}
preprocess() {
in="$1"
@ -41,7 +48,7 @@ test_run() {
# happy tests
for f in test-*.input; do
echo "*** Running $f"
rm -f $TESTDIR/etc/*{passwd,group,shadow}
prepare_testdir ${f%.input}
cp $f $TESTDIR/usr/lib/sysusers.d/test.conf
systemd-sysusers --root=$TESTDIR
@ -50,7 +57,7 @@ test_run() {
for f in test-*.input; do
echo "*** Running $f on stdin"
rm -f $TESTDIR/etc/*{passwd,group,shadow}
prepare_testdir ${f%.input}
touch $TESTDIR/etc/sysusers.d/test.conf
cat $f | systemd-sysusers --root=$TESTDIR -
@ -59,7 +66,7 @@ test_run() {
for f in test-*.input; do
echo "*** Running $f on stdin with --replace"
rm -f $TESTDIR/etc/*{passwd,group,shadow}
prepare_testdir ${f%.input}
touch $TESTDIR/etc/sysusers.d/test.conf
# this overrides test.conf which is masked on disk
cat $f | systemd-sysusers --root=$TESTDIR --replace=/etc/sysusers.d/test.conf -
@ -71,7 +78,7 @@ test_run() {
# test --inline
echo "*** Testing --inline"
rm -f $TESTDIR/etc/*{passwd,group,shadow}
prepare_testdir
# copy a random file to make sure it is ignored
cp $f $TESTDIR/etc/sysusers.d/confuse.conf
systemd-sysusers --root=$TESTDIR --inline \
@ -82,7 +89,7 @@ test_run() {
# test --replace
echo "*** Testing --inline with --replace"
rm -f $TESTDIR/etc/*{passwd,group,shadow}
prepare_testdir
# copy a random file to make sure it is ignored
cp $f $TESTDIR/etc/sysusers.d/confuse.conf
systemd-sysusers --root=$TESTDIR \
@ -98,7 +105,7 @@ test_run() {
# tests for error conditions
for f in unhappy-*.input; do
echo "*** Running test $f"
rm -f $TESTDIR/etc/*{passwd,group,shadow}
prepare_testdir ${f%.input}
cp $f $TESTDIR/usr/lib/sysusers.d/test.conf
systemd-sysusers --root=$TESTDIR 2> /dev/null
journalctl -t systemd-sysusers -o cat | tail -n1 > $TESTDIR/tmp/err