util-lib: move take_password_lock() to user-util.[ch]

Also, rename it take_etc_passwd_lock(), in order to make it more
expressive.
This commit is contained in:
Lennart Poettering 2015-10-26 19:08:09 +01:00
parent bb15fafe9c
commit e929bee09a
6 changed files with 46 additions and 44 deletions

View File

@ -22,6 +22,7 @@
#include <pwd.h>
#include <grp.h>
#include "fd-util.h"
#include "macro.h"
#include "parse-util.h"
#include "path-util.h"
@ -428,3 +429,43 @@ int reset_uid_gid(void) {
return 0;
}
int take_etc_passwd_lock(const char *root) {
struct flock flock = {
.l_type = F_WRLCK,
.l_whence = SEEK_SET,
.l_start = 0,
.l_len = 0,
};
const char *path;
int fd, r;
/* This is roughly the same as lckpwdf(), but not as awful. We
* don't want to use alarm() and signals, hence we implement
* our own trivial version of this.
*
* Note that shadow-utils also takes per-database locks in
* addition to lckpwdf(). However, we don't given that they
* are redundant as they they invoke lckpwdf() first and keep
* it during everything they do. The per-database locks are
* awfully racy, and thus we just won't do them. */
if (root)
path = prefix_roota(root, "/etc/.pwd.lock");
else
path = "/etc/.pwd.lock";
fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0600);
if (fd < 0)
return -errno;
r = fcntl(fd, F_SETLKW, &flock);
if (r < 0) {
safe_close(fd);
return -errno;
}
return fd;
}

View File

@ -52,3 +52,5 @@ int get_home_dir(char **ret);
int get_shell(char **_ret);
int reset_uid_gid(void);
int take_etc_passwd_lock(const char *root);

View File

@ -2096,46 +2096,6 @@ int update_reboot_param_file(const char *param) {
return 0;
}
int take_password_lock(const char *root) {
struct flock flock = {
.l_type = F_WRLCK,
.l_whence = SEEK_SET,
.l_start = 0,
.l_len = 0,
};
const char *path;
int fd, r;
/* This is roughly the same as lckpwdf(), but not as awful. We
* don't want to use alarm() and signals, hence we implement
* our own trivial version of this.
*
* Note that shadow-utils also takes per-database locks in
* addition to lckpwdf(). However, we don't given that they
* are redundant as they they invoke lckpwdf() first and keep
* it during everything they do. The per-database locks are
* awfully racy, and thus we just won't do them. */
if (root)
path = strjoina(root, "/etc/.pwd.lock");
else
path = "/etc/.pwd.lock";
fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0600);
if (fd < 0)
return -errno;
r = fcntl(fd, F_SETLKW, &flock);
if (r < 0) {
safe_close(fd);
return -errno;
}
return fd;
}
int is_symlink(const char *path) {
struct stat info;

View File

@ -519,8 +519,6 @@ union file_handle_union {
int update_reboot_param_file(const char *param);
int take_password_lock(const char *root);
int is_symlink(const char *path);
int is_dir(const char *path, bool follow);
int is_device_node(const char *path);

View File

@ -38,6 +38,7 @@
#include "strv.h"
#include "terminal-util.h"
#include "time-util.h"
#include "user-util.h"
static char *arg_root = NULL;
static char *arg_locale = NULL; /* $LANG */
@ -536,7 +537,7 @@ static int process_root_password(void) {
mkdir_parents(etc_shadow, 0755);
lock = take_password_lock(arg_root);
lock = take_etc_passwd_lock(arg_root);
if (lock < 0)
return lock;

View File

@ -1859,7 +1859,7 @@ int main(int argc, char *argv[]) {
if (r < 0)
goto finish;
lock = take_password_lock(arg_root);
lock = take_etc_passwd_lock(arg_root);
if (lock < 0) {
log_error_errno(lock, "Failed to take lock: %m");
goto finish;