]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/uaccess.c
umask: change default umask to 0022 just to be sure, and set it explicitly in all...
[thirdparty/systemd.git] / src / uaccess.c
CommitLineData
5eda94dd
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2011 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
22#include <errno.h>
23#include <string.h>
24
25#include "logind-acl.h"
26#include "util.h"
27#include "log.h"
d40c9816 28#include "sd-daemon.h"
3d7d60c8 29#include "sd-login.h"
5eda94dd
LP
30
31int main(int argc, char *argv[]) {
32 int r;
501c92c4 33 const char *path = NULL, *seat;
f5f32cd7 34 bool changed_acl = false;
3d7d60c8 35 uid_t uid;
5eda94dd
LP
36
37 log_set_target(LOG_TARGET_AUTO);
38 log_parse_environment();
39 log_open();
40
4c12626c
LP
41 umask(0022);
42
0b191e60
LP
43 if (argc < 2 || argc > 3) {
44 log_error("This program expects one or two arguments.");
5eda94dd
LP
45 r = -EINVAL;
46 goto finish;
47 }
48
d40c9816
LP
49 /* Make sure we don't muck around with ACLs the system is not
50 * running systemd. */
51 if (!sd_booted())
52 return 0;
53
5eda94dd 54 path = argv[1];
53907215 55 seat = argc < 3 || isempty(argv[2]) ? "seat0" : argv[2];
5eda94dd 56
3d7d60c8
LP
57 r = sd_seat_get_active(seat, NULL, &uid);
58 if (r == -ENOENT) {
59 /* No active session on this seat */
60 r = 0;
61 goto finish;
62 } else if (r < 0) {
63 log_error("Failed to determine active user on seat %s.", seat);
5eda94dd
LP
64 goto finish;
65 }
66
3d7d60c8 67 r = devnode_acl(path, true, false, 0, true, uid);
5eda94dd 68 if (r < 0) {
3d7d60c8 69 log_error("Failed to apply ACL on %s: %s", path, strerror(-r));
5eda94dd
LP
70 goto finish;
71 }
72
3d7d60c8 73 changed_acl = true;
5eda94dd
LP
74 r = 0;
75
76finish:
f5f32cd7
LP
77 if (path && !changed_acl) {
78 int k;
79 /* Better be safe that sorry and reset ACL */
80
81 k = devnode_acl(path, true, false, 0, false, 0);
82 if (k < 0) {
83 log_error("Failed to apply ACL on %s: %s", path, strerror(-k));
84 if (r >= 0)
85 r = k;
86 }
87 }
88
5eda94dd
LP
89 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
90}