base-passwd: install passwd and group atomically

Fixed the race issue:
util-macros.do_package failed: 'getpwnam(): name not found: root'

The error happens when there is a half etc/passwd, fixed by:
$ install usr/share/base-passwd/passwd.master etc/passwd.master
$ mv etc/passwd.master etc/passwd

The "mv" is atomic which will fix this problem.

[YOCTO #6124]

(From OE-Core rev: cdbe55215e3dd1b82a6c147a31c7c40186a8bf80)

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Robert Yang 2014-07-06 21:40:37 -07:00 committed by Richard Purdie
parent 7e6eeeefdd
commit 949bf156ca
1 changed files with 7 additions and 2 deletions

View File

@ -47,9 +47,14 @@ base_passwd_sstate_postinst() {
# put these files in the target sysroot so they can
# be used by recipes which use custom user/group
# permissions.
# Install passwd.master and group.master to sysconfdir and mv
# them to make sure they are atomically install.
install -d -m 755 ${STAGING_DIR_TARGET}${sysconfdir}
install -p -m 644 ${STAGING_DIR_TARGET}${datadir}/base-passwd/passwd.master ${STAGING_DIR_TARGET}${sysconfdir}/passwd
install -p -m 644 ${STAGING_DIR_TARGET}${datadir}/base-passwd/group.master ${STAGING_DIR_TARGET}${sysconfdir}/group
for i in passwd group; do
install -p -m 644 ${STAGING_DIR_TARGET}${datadir}/base-passwd/$i.master \
${STAGING_DIR_TARGET}${sysconfdir}/
mv ${STAGING_DIR_TARGET}${sysconfdir}/$i.master ${STAGING_DIR_TARGET}${sysconfdir}/$i
done
fi
}