chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
machine: make sure unpriviliged "machinectl status" can show the machine's OS version
[elogind.git]
/
src
/
sysusers
/
sysusers.c
diff --git
a/src/sysusers/sysusers.c
b/src/sysusers/sysusers.c
index d679394dfad7e6bb790747a08dc9289f0c29cd52..19568adf7a820581171b7ce723c8616ca175bafb 100644
(file)
--- a/
src/sysusers/sysusers.c
+++ b/
src/sysusers/sysusers.c
@@
-195,8
+195,9
@@
static int load_group_database(void) {
return 0;
}
return 0;
}
-static int make_backup(const char *x) {
- _cleanup_close_ int src = -1, dst = -1;
+static int make_backup(const char *target, const char *x) {
+ _cleanup_close_ int src = -1;
+ _cleanup_fclose_ FILE *dst = NULL;
char *backup, *temp;
struct timespec ts[2];
struct stat st;
char *backup, *temp;
struct timespec ts[2];
struct stat st;
@@
-213,30
+214,30
@@
static int make_backup(const char *x) {
if (fstat(src, &st) < 0)
return -errno;
if (fstat(src, &st) < 0)
return -errno;
- temp = strappenda(x, ".XXXXXX");
- dst = mkostemp_safe(temp, O_WRONLY|O_CLOEXEC|O_NOCTTY);
- if (dst < 0)
- return dst;
+ r = fopen_temporary_label(target, x, &dst, &temp);
+ if (r < 0)
+ return r;
- r = copy_bytes(src,
dst
, (off_t) -1);
+ r = copy_bytes(src,
fileno(dst)
, (off_t) -1);
if (r < 0)
goto fail;
if (r < 0)
goto fail;
+ /* Don't fail on chmod() or chown(). If it stays owned by us
+ * and/or unreadable by others, then it isn't too bad... */
+
+ backup = strappenda(x, "-");
+
/* Copy over the access mask */
/* Copy over the access mask */
- if (fchmod(dst, st.st_mode & 07777) < 0) {
- r = -errno;
- goto fail;
- }
+ if (fchmod(fileno(dst), st.st_mode & 07777) < 0)
+ log_warning("Failed to change mode on %s: %m", backup);
- /* Don't fail on chmod(). If it stays owned by us, then it
- * isn't too bad... */
- fchown(dst, st.st_uid, st.st_gid);
+ if (fchown(fileno(dst), st.st_uid, st.st_gid)< 0)
+ log_warning("Failed to change ownership of %s: %m", backup);
ts[0] = st.st_atim;
ts[1] = st.st_mtim;
ts[0] = st.st_atim;
ts[1] = st.st_mtim;
- futimens(
dst
, ts);
+ futimens(
fileno(dst)
, ts);
- backup = strappenda(x, "-");
if (rename(temp, backup) < 0)
goto fail;
if (rename(temp, backup) < 0)
goto fail;
@@
-469,13
+470,13
@@
static int write_files(void) {
/* Make a backup of the old files */
if (group && group_changed) {
/* Make a backup of the old files */
if (group && group_changed) {
- r = make_backup(group_path);
+ r = make_backup(
"/etc/group",
group_path);
if (r < 0)
goto finish;
}
if (passwd) {
if (r < 0)
goto finish;
}
if (passwd) {
- r = make_backup(passwd_path);
+ r = make_backup(
"/etc/passwd",
passwd_path);
if (r < 0)
goto finish;
}
if (r < 0)
goto finish;
}
@@
-1412,16
+1413,13
@@
static void free_database(Hashmap *by_name, Hashmap *by_id) {
hashmap_free(by_id);
}
hashmap_free(by_id);
}
-static int help(void) {
-
+static void help(void) {
printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
"Creates system user accounts.\n\n"
" -h --help Show this help\n"
" --version Show package version\n"
printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n"
"Creates system user accounts.\n\n"
" -h --help Show this help\n"
" --version Show package version\n"
- " --root=PATH Operate on an alternate filesystem root\n",
- program_invocation_short_name);
-
- return 0;
+ " --root=PATH Operate on an alternate filesystem root\n"
+ , program_invocation_short_name);
}
static int parse_argv(int argc, char *argv[]) {
}
static int parse_argv(int argc, char *argv[]) {
@@
-1443,12
+1441,13
@@
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
assert(argc >= 0);
assert(argv);
- while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
{
+ while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
switch (c) {
case 'h':
switch (c) {
case 'h':
- return help();
+ help();
+ return 0;
case ARG_VERSION:
puts(PACKAGE_STRING);
case ARG_VERSION:
puts(PACKAGE_STRING);
@@
-1470,7
+1469,6
@@
static int parse_argv(int argc, char *argv[]) {
default:
assert_not_reached("Unhandled option");
}
default:
assert_not_reached("Unhandled option");
}
- }
return 1;
}
return 1;
}
@@
-1493,9
+1491,11
@@
int main(int argc, char *argv[]) {
umask(0022);
umask(0022);
- label_init(NULL);
-
- r = 0;
+ r = label_init(NULL);
+ if (r < 0) {
+ log_error("SELinux setup failed: %s", strerror(-r));
+ goto finish;
+ }
if (optind < argc) {
int j;
if (optind < argc) {
int j;