dbus-execute.c revision 891703e1eef9f9850c7bd34b6d9df0e6c2c8a939
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner/***
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu This file is part of systemd.
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu Copyright 2010 Lennart Poettering
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance systemd is free software; you can redistribute it and/or modify it
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu under the terms of the GNU General Public License as published by
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu the Free Software Foundation; either version 2 of the License, or
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu (at your option) any later version.
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu systemd is distributed in the hope that it will be useful, but
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu WITHOUT ANY WARRANTY; without even the implied warranty of
19e01e1a7e319063434bd86c8ecbc5f241ef9993Felix Gabriel Mance MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu General Public License for more details.
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu You should have received a copy of the GNU General Public License
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance along with systemd; If not, see <http://www.gnu.org/licenses/>.
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu***/
be2439588008221e691321fdf4f75432cfb72878Felix Gabriel Mance
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu#include <errno.h>
fc05327b875b5723b6c17849b83477f29ec12c90Felix Gabriel Mance#include <dbus/dbus.h>
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu#include <sys/prctl.h>
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu#include "dbus-execute.h"
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu#include "missing.h"
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder#include "ioprio.h"
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu#include "strv.h"
e0f1794e365dd347e97b37d7d22b2fce27296fa1Christian Maeder#include "dbus-common.h"
424860079d47bf490fa98d5d7498096a0447c569mcodescu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae BungiuDEFINE_BUS_PROPERTY_APPEND_ENUM(bus_execute_append_kill_mode, kill_mode, KillMode);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
1a38107941725211e7c3f051f7a8f5e12199f03acmaederDEFINE_BUS_PROPERTY_APPEND_ENUM(bus_execute_append_input, exec_input, ExecInput);
1a38107941725211e7c3f051f7a8f5e12199f03acmaederDEFINE_BUS_PROPERTY_APPEND_ENUM(bus_execute_append_output, exec_output, ExecOutput);
32bbac77828be0233953f8fe476edb0a9585408dChristian Maeder
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiuint bus_execute_append_env_files(DBusMessageIter *i, const char *property, void *data) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu char **env_files = data, **j;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu DBusMessageIter sub, sub2;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(i);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(property);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "(sb)", &sub))
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance return -ENOMEM;
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu STRV_FOREACH(j, env_files) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu dbus_bool_t b = false;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu char *fn = *j;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (fn[0] == '-') {
b84c87f199dc287d235d7dad6ea344f6912ef531Christian Maeder b = true;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu fn++;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu }
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
be00381168b3f10192afabbba136fb06d3a9f358Christian Maeder if (!dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &sub2) ||
be00381168b3f10192afabbba136fb06d3a9f358Christian Maeder !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &fn) ||
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_BOOLEAN, &b) ||
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance !dbus_message_iter_close_container(&sub, &sub2))
7852de3551fc797566ee71165bafe05b6d81728cnotanartist return -ENOMEM;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu }
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (!dbus_message_iter_close_container(i, &sub))
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return -ENOMEM;
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance return 0;
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance}
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Manceint bus_execute_append_oom_score_adjust(DBusMessageIter *i, const char *property, void *data) {
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance ExecContext *c = data;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu int32_t n;
27fdf879983dd28e211b41f3be6c0e930b7c816bFelix Gabriel Mance
424860079d47bf490fa98d5d7498096a0447c569mcodescu assert(i);
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance assert(property);
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance assert(c);
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder
424860079d47bf490fa98d5d7498096a0447c569mcodescu if (c->oom_score_adjust_set)
424860079d47bf490fa98d5d7498096a0447c569mcodescu n = c->oom_score_adjust;
424860079d47bf490fa98d5d7498096a0447c569mcodescu else {
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance char *t;
d6d81ead61a5f9fb7d047e623f7898e730c258camcodescu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu n = 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (read_one_line_file("/proc/self/oom_score_adj", &t) >= 0) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu safe_atoi(t, &n);
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance free(t);
7852de3551fc797566ee71165bafe05b6d81728cnotanartist } else if (read_one_line_file("/proc/self/oom_adj", &t) >= 0) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu safe_atoi(t, &n);
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Mance free(t);
9475501a6acf48434052d9e6f4a05ed6681eaaabFrancisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (n == OOM_ADJUST_MAX)
7852de3551fc797566ee71165bafe05b6d81728cnotanartist n = OOM_SCORE_ADJ_MAX;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski else
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski n = (n * OOM_SCORE_ADJ_MAX) / -OOM_DISABLE;
424860079d47bf490fa98d5d7498096a0447c569mcodescu }
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder }
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder
424860079d47bf490fa98d5d7498096a0447c569mcodescu if (!dbus_message_iter_append_basic(i, DBUS_TYPE_INT32, &n))
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder return -ENOMEM;
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu}
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance
60f30f0eeeacdfc1e0dfe39664373ddf5a0675adFelix Gabriel Manceint bus_execute_append_nice(DBusMessageIter *i, const char *property, void *data) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu ExecContext *c = data;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu int32_t n;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(i);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(property);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(c);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (c->nice_set)
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu n = c->nice;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu else
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder n = getpriority(PRIO_PROCESS, 0);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (!dbus_message_iter_append_basic(i, DBUS_TYPE_INT32, &n))
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder return -ENOMEM;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu}
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroederint bus_execute_append_ioprio(DBusMessageIter *i, const char *property, void *data) {
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu ExecContext *c = data;
31e9d2a02e15b7dbc157e0d3fb3b84f6c8666482Christian Maeder int32_t n;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(i);
656f17ae9b7610ff2de1b6eedeeadea0c3bcdc8dChristian Maeder assert(property);
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance assert(c);
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance if (c->ioprio_set)
d3cb3401882f6956de016f8eecbec1cd3b868acbFelix Gabriel Mance n = c->ioprio;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu else
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu n = ioprio_get(IOPRIO_WHO_PROCESS, 0);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
7852de3551fc797566ee71165bafe05b6d81728cnotanartist if (!dbus_message_iter_append_basic(i, DBUS_TYPE_INT32, &n))
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return -ENOMEM;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return 0;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu}
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiuint bus_execute_append_cpu_sched_policy(DBusMessageIter *i, const char *property, void *data) {
0dd6e7830de0887c9a12356447975a826b3b3db2Christian Maeder ExecContext *c = data;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu int32_t n;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(i);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(property);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(c);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
06acd8a23b2f06e7b2373d53f738cf56c7f03223Francisc Nicolae Bungiu if (c->cpu_sched_set)
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu n = c->cpu_sched_policy;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu else
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu n = sched_getscheduler(0);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (!dbus_message_iter_append_basic(i, DBUS_TYPE_INT32, &n))
7852de3551fc797566ee71165bafe05b6d81728cnotanartist return -ENOMEM;
32bbac77828be0233953f8fe476edb0a9585408dChristian Maeder
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski return 0;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski}
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowskiint bus_execute_append_cpu_sched_priority(DBusMessageIter *i, const char *property, void *data) {
32bbac77828be0233953f8fe476edb0a9585408dChristian Maeder ExecContext *c = data;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski int32_t n;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder assert(i);
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder assert(property);
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder assert(c);
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder
b84c87f199dc287d235d7dad6ea344f6912ef531Christian Maeder if (c->cpu_sched_set)
7852de3551fc797566ee71165bafe05b6d81728cnotanartist n = c->cpu_sched_priority;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski else {
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder struct sched_param p;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder n = 0;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder zero(p);
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder if (sched_getparam(0, &p) >= 0)
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder n = p.sched_priority;
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder }
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder if (!dbus_message_iter_append_basic(i, DBUS_TYPE_INT32, &n))
cf0439f74f1d55a9840d38a88f9b0f4fc00d5547Christian Maeder return -ENOMEM;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return 0;
7852de3551fc797566ee71165bafe05b6d81728cnotanartist}
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
7852de3551fc797566ee71165bafe05b6d81728cnotanartistint bus_execute_append_affinity(DBusMessageIter *i, const char *property, void *data) {
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski ExecContext *c = data;
624f8c31bd8d6746b93f4b5966aa6fc7680fefc5Felix Gabriel Mance dbus_bool_t b;
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski DBusMessageIter sub;
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(i);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(property);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu assert(c);
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "y", &sub))
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return -ENOMEM;
b84c87f199dc287d235d7dad6ea344f6912ef531Christian Maeder
624f8c31bd8d6746b93f4b5966aa6fc7680fefc5Felix Gabriel Mance if (c->cpuset)
7852de3551fc797566ee71165bafe05b6d81728cnotanartist b = dbus_message_iter_append_fixed_array(&sub, DBUS_TYPE_BYTE, &c->cpuset, CPU_ALLOC_SIZE(c->cpuset_ncpus));
624f8c31bd8d6746b93f4b5966aa6fc7680fefc5Felix Gabriel Mance else
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder b = dbus_message_iter_append_fixed_array(&sub, DBUS_TYPE_BYTE, &c->cpuset, 0);
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu if (!b)
ee93ea764a2b8189253e912c8447f9419033f6d4Francisc Nicolae Bungiu return -ENOMEM;
d0f58d27c2536eba454d8f77de8617bc6a2c99cdFelix Gabriel Mance
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance if (!dbus_message_iter_close_container(i, &sub))
431571057e88a650a974adec93ea4bb5173b6213Felix Gabriel Mance return -ENOMEM;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu return 0;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu}
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescuint bus_execute_append_timer_slack_nsec(DBusMessageIter *i, const char *property, void *data) {
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu ExecContext *c = data;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu uint64_t u;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu assert(i);
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu assert(property);
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu assert(c);
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu if (c->timer_slack_nsec_set)
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu u = (uint64_t) c->timer_slack_nsec;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu else
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu u = (uint64_t) prctl(PR_GET_TIMERSLACK);
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu if (!dbus_message_iter_append_basic(i, DBUS_TYPE_UINT64, &u))
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu return -ENOMEM;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu return 0;
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu}
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescu
b90f0b7fd6ccfbdd7e5adb65b1f6c02c7758ff5cmcodescuint bus_execute_append_capability_bs(DBusMessageIter *i, const char *property, void *data) {
ExecContext *c = data;
uint64_t normal, inverted;
assert(i);
assert(property);
assert(c);
/* We store this negated internally, to match the kernel, but
* we expose it normalized. */
normal = *(uint64_t*) data;
inverted = ~normal;
return bus_property_append_uint64(i, property, &inverted);
}
int bus_execute_append_capabilities(DBusMessageIter *i, const char *property, void *data) {
ExecContext *c = data;
char *t = NULL;
const char *s;
dbus_bool_t b;
assert(i);
assert(property);
assert(c);
if (c->capabilities)
s = t = cap_to_text(c->capabilities, NULL);
else
s = "";
if (!s)
return -ENOMEM;
b = dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &s);
if (t)
cap_free(t);
if (!b)
return -ENOMEM;
return 0;
}
int bus_execute_append_rlimits(DBusMessageIter *i, const char *property, void *data) {
ExecContext *c = data;
int r;
uint64_t u;
assert(i);
assert(property);
assert(c);
assert_se((r = rlimit_from_string(property)) >= 0);
if (c->rlimit[r])
u = (uint64_t) c->rlimit[r]->rlim_max;
else {
struct rlimit rl;
zero(rl);
getrlimit(r, &rl);
u = (uint64_t) rl.rlim_max;
}
if (!dbus_message_iter_append_basic(i, DBUS_TYPE_UINT64, &u))
return -ENOMEM;
return 0;
}
int bus_execute_append_command(DBusMessageIter *i, const char *property, void *data) {
ExecCommand *c = data;
DBusMessageIter sub, sub2, sub3;
assert(i);
assert(property);
if (!dbus_message_iter_open_container(i, DBUS_TYPE_ARRAY, "(sasbttttuii)", &sub))
return -ENOMEM;
LIST_FOREACH(command, c, c) {
char **l;
uint32_t pid;
int32_t code, status;
dbus_bool_t b;
if (!c->path)
continue;
if (!dbus_message_iter_open_container(&sub, DBUS_TYPE_STRUCT, NULL, &sub2) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &c->path) ||
!dbus_message_iter_open_container(&sub2, DBUS_TYPE_ARRAY, "s", &sub3))
return -ENOMEM;
STRV_FOREACH(l, c->argv)
if (!dbus_message_iter_append_basic(&sub3, DBUS_TYPE_STRING, l))
return -ENOMEM;
pid = (uint32_t) c->exec_status.pid;
code = (int32_t) c->exec_status.code;
status = (int32_t) c->exec_status.status;
b = !!c->ignore;
if (!dbus_message_iter_close_container(&sub2, &sub3) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_BOOLEAN, &b) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT64, &c->exec_status.start_timestamp.realtime) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT64, &c->exec_status.start_timestamp.monotonic) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT64, &c->exec_status.exit_timestamp.realtime) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT64, &c->exec_status.exit_timestamp.monotonic) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT32, &pid) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_INT32, &code) ||
!dbus_message_iter_append_basic(&sub2, DBUS_TYPE_INT32, &status))
return -ENOMEM;
if (!dbus_message_iter_close_container(&sub, &sub2))
return -ENOMEM;
}
if (!dbus_message_iter_close_container(i, &sub))
return -ENOMEM;
return 0;
}
const BusProperty bus_exec_context_properties[] = {
{ "Environment", bus_property_append_strv, "as", offsetof(ExecContext, environment), true },
{ "EnvironmentFiles", bus_execute_append_env_files, "a(sb)", offsetof(ExecContext, environment_files), true },
{ "UMask", bus_property_append_mode, "u", offsetof(ExecContext, umask) },
{ "LimitCPU", bus_execute_append_rlimits, "t", 0 },
{ "LimitFSIZE", bus_execute_append_rlimits, "t", 0 },
{ "LimitDATA", bus_execute_append_rlimits, "t", 0 },
{ "LimitSTACK", bus_execute_append_rlimits, "t", 0 },
{ "LimitCORE", bus_execute_append_rlimits, "t", 0 },
{ "LimitRSS", bus_execute_append_rlimits, "t", 0 },
{ "LimitNOFILE", bus_execute_append_rlimits, "t", 0 },
{ "LimitAS", bus_execute_append_rlimits, "t", 0 },
{ "LimitNPROC", bus_execute_append_rlimits, "t", 0 },
{ "LimitMEMLOCK", bus_execute_append_rlimits, "t", 0 },
{ "LimitLOCKS", bus_execute_append_rlimits, "t", 0 },
{ "LimitSIGPENDING", bus_execute_append_rlimits, "t", 0 },
{ "LimitMSGQUEUE", bus_execute_append_rlimits, "t", 0 },
{ "LimitNICE", bus_execute_append_rlimits, "t", 0 },
{ "LimitRTPRIO", bus_execute_append_rlimits, "t", 0 },
{ "LimitRTTIME", bus_execute_append_rlimits, "t", 0 },
{ "WorkingDirectory", bus_property_append_string, "s", offsetof(ExecContext, working_directory), true },
{ "RootDirectory", bus_property_append_string, "s", offsetof(ExecContext, root_directory), true },
{ "OOMScoreAdjust", bus_execute_append_oom_score_adjust, "i", 0 },
{ "Nice", bus_execute_append_nice, "i", 0 },
{ "IOScheduling", bus_execute_append_ioprio, "i", 0 },
{ "CPUSchedulingPolicy", bus_execute_append_cpu_sched_policy, "i", 0 },
{ "CPUSchedulingPriority", bus_execute_append_cpu_sched_priority, "i", 0 },
{ "CPUAffinity", bus_execute_append_affinity, "ay", 0 },
{ "TimerSlackNSec", bus_execute_append_timer_slack_nsec, "t", 0 },
{ "CPUSchedulingResetOnFork", bus_property_append_bool, "b", offsetof(ExecContext, cpu_sched_reset_on_fork) },
{ "NonBlocking", bus_property_append_bool, "b", offsetof(ExecContext, non_blocking) },
{ "StandardInput", bus_execute_append_input, "s", offsetof(ExecContext, std_input) },
{ "StandardOutput", bus_execute_append_output, "s", offsetof(ExecContext, std_output) },
{ "StandardError", bus_execute_append_output, "s", offsetof(ExecContext, std_error) },
{ "TTYPath", bus_property_append_string, "s", offsetof(ExecContext, tty_path), true },
{ "TTYReset", bus_property_append_bool, "b", offsetof(ExecContext, tty_reset) },
{ "TTYVHangup", bus_property_append_bool, "b", offsetof(ExecContext, tty_vhangup) },
{ "TTYVTDisallocate", bus_property_append_bool, "b", offsetof(ExecContext, tty_vt_disallocate) },
{ "SyslogPriority", bus_property_append_int, "i", offsetof(ExecContext, syslog_priority) },
{ "SyslogIdentifier", bus_property_append_string, "s", offsetof(ExecContext, syslog_identifier), true },
{ "SyslogLevelPrefix", bus_property_append_bool, "b", offsetof(ExecContext, syslog_level_prefix) },
{ "Capabilities", bus_execute_append_capabilities, "s", 0 },
{ "SecureBits", bus_property_append_int, "i", offsetof(ExecContext, secure_bits) },
{ "CapabilityBoundingSet", bus_execute_append_capability_bs, "t", offsetof(ExecContext, capability_bounding_set_drop) },
{ "User", bus_property_append_string, "s", offsetof(ExecContext, user), true },
{ "Group", bus_property_append_string, "s", offsetof(ExecContext, group), true },
{ "SupplementaryGroups", bus_property_append_strv, "as", offsetof(ExecContext, supplementary_groups), true },
{ "TCPWrapName", bus_property_append_string, "s", offsetof(ExecContext, tcpwrap_name), true },
{ "PAMName", bus_property_append_string, "s", offsetof(ExecContext, pam_name), true },
{ "ReadWriteDirectories", bus_property_append_strv, "as", offsetof(ExecContext, read_write_dirs), true },
{ "ReadOnlyDirectories", bus_property_append_strv, "as", offsetof(ExecContext, read_only_dirs), true },
{ "InaccessibleDirectories", bus_property_append_strv, "as", offsetof(ExecContext, inaccessible_dirs), true },
{ "MountFlags", bus_property_append_ul, "t", offsetof(ExecContext, mount_flags) },
{ "PrivateTmp", bus_property_append_bool, "b", offsetof(ExecContext, private_tmp) },
{ "PrivateNetwork", bus_property_append_bool, "b", offsetof(ExecContext, private_network) },
{ "SameProcessGroup", bus_property_append_bool, "b", offsetof(ExecContext, same_pgrp) },
{ "KillMode", bus_execute_append_kill_mode, "s", offsetof(ExecContext, kill_mode) },
{ "KillSignal", bus_property_append_int, "i", offsetof(ExecContext, kill_signal) },
{ "UtmpIdentifier", bus_property_append_string, "s", offsetof(ExecContext, utmp_id), true },
{ "ControlGroupModify", bus_property_append_bool, "b", offsetof(ExecContext, control_group_modify) },
{ "ControlGroupModify", bus_property_append_bool, "b", offsetof(ExecContext, control_group_persistent) },
{ NULL, }
};