c2756a68401102786be343712c0c35acbd73d28dLennart Poettering/***
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering This file is part of systemd.
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering Copyright 2013 Lennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering systemd is free software; you can redistribute it and/or modify it
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering under the terms of the GNU Lesser General Public License as published by
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering (at your option) any later version.
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering systemd is distributed in the hope that it will be useful, but
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering Lesser General Public License for more details.
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering You should have received a copy of the GNU Lesser General Public License
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering***/
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering#include <getopt.h>
3f6fd1ba65f962702753c4ad284b588e59689a23Lennart Poettering#include <stdio.h>
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering#include "sd-bus.h"
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering#include "sd-event.h"
3f6fd1ba65f962702753c4ad284b588e59689a23Lennart Poettering
b5efdb8af40ea759a1ea584c1bc44ecc81dd00ceLennart Poettering#include "alloc-util.h"
3f6fd1ba65f962702753c4ad284b588e59689a23Lennart Poettering#include "bus-error.h"
40ca29a1370379d43e44c0ed425eecc7218dcbcaLennart Poettering#include "bus-util.h"
3f6fd1ba65f962702753c4ad284b588e59689a23Lennart Poettering#include "calendarspec.h"
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering#include "env-util.h"
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering#include "fd-util.h"
3f6fd1ba65f962702753c4ad284b588e59689a23Lennart Poettering#include "formats-util.h"
cf0fbc49e67b55f8d346fc94de28c90113505297Thomas Hindoe Paaboel Andersen#include "parse-util.h"
4bcc8c3cb57733de6eeb2528a194501fade11e6bZbigniew Jędrzejewski-Szmek#include "path-util.h"
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering#include "ptyfwd.h"
24882e06c135584f16f31ba8a00fecde8b7f6fadLennart Poettering#include "signal-util.h"
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin#include "spawn-polkit-agent.h"
3f6fd1ba65f962702753c4ad284b588e59689a23Lennart Poettering#include "strv.h"
66cb2fde7b0ab6603775ad13c30c004f5fd88f0cLennart Poettering#include "terminal-util.h"
3f6fd1ba65f962702753c4ad284b588e59689a23Lennart Poettering#include "unit-name.h"
b1d4f8e154bf61b5de1b27461ef8e9c8c5e838a1Lennart Poettering#include "user-util.h"
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchaginstatic bool arg_ask_password = true;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poetteringstatic bool arg_scope = false;
6577c7cea72f19185ad999c223bcf663c010dc6fLennart Poetteringstatic bool arg_remain_after_exit = false;
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poetteringstatic bool arg_no_block = false;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poetteringstatic const char *arg_unit = NULL;
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poetteringstatic const char *arg_description = NULL;
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poetteringstatic const char *arg_slice = NULL;
a6c0353b9268d5b780fb7ff05a10cb5031446e5dLennart Poetteringstatic bool arg_send_sighup = false;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poetteringstatic BusTransport arg_transport = BUS_TRANSPORT_LOCAL;
1ac67edb7c4d31a287fa98c0b554ae98bd34e71bLennart Poetteringstatic const char *arg_host = NULL;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poetteringstatic bool arg_user = false;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poetteringstatic const char *arg_service_type = NULL;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poetteringstatic const char *arg_exec_user = NULL;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poetteringstatic const char *arg_exec_group = NULL;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poetteringstatic int arg_nice = 0;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poetteringstatic bool arg_nice_set = false;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poetteringstatic char **arg_environment = NULL;
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poetteringstatic char **arg_property = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic bool arg_pty = false;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic usec_t arg_on_active = 0;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic usec_t arg_on_boot = 0;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic usec_t arg_on_startup = 0;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic usec_t arg_on_unit_active = 0;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic usec_t arg_on_unit_inactive = 0;
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poetteringstatic const char *arg_on_calendar = NULL;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic char **arg_timer_property = NULL;
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poetteringstatic bool arg_quiet = false;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchaginstatic void polkit_agent_open_if_enabled(void) {
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin /* Open the polkit agent as a child process if necessary */
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin if (!arg_ask_password)
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin return;
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin if (arg_transport != BUS_TRANSPORT_LOCAL)
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin return;
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin polkit_agent_open();
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin}
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
601185b43da638b1c74153deae01dbd518680889Zbigniew Jędrzejewski-Szmekstatic void help(void) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho printf("%s [OPTIONS...] {COMMAND} [ARGS...]\n\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "Run the specified command in a transient scope or service or timer\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "unit. If timer option is specified and unit is exist which is\n"
cd32b977facd20145f570efbfdf541ffc2780c4eZbigniew Jędrzejewski-Szmek "specified with --unit option then command can be omitted.\n\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -h --help Show this help\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --version Show package version\n"
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin " --no-ask-password Do not prompt for password\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --user Run as user unit\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -H --host=[USER@]HOST Operate on remote host\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -M --machine=CONTAINER Operate on local container\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --scope Run this as scope rather than service\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --unit=UNIT Run under the specified unit name\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -p --property=NAME=VALUE Set unit property\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --description=TEXT Description for unit\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --slice=SLICE Run in the specified slice\n"
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering " --no-block Do not wait until operation finished\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " -r --remain-after-exit Leave service around until explicitly stopped\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --send-sighup Send SIGHUP when terminating\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --service-type=TYPE Service type\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --uid=USER Run as system user\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --gid=GROUP Run as system group\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --nice=NICE Nice level\n"
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering " --setenv=NAME=VALUE Set environment\n"
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering " -t --pty Run service on pseudo tty\n"
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering " -q --quiet Suppress information messages during runtime\n\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "Timer options:\n\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-active=SECONDS Run after SECONDS delay\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-boot=SECONDS Run SECONDS after machine was booted up\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-startup=SECONDS Run SECONDS after systemd activation\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-unit-active=SECONDS Run SECONDS after the last activation\n"
b57b06258e0b1894edb6d1fc52a80b3c33164892Zbigniew Jędrzejewski-Szmek " --on-unit-inactive=SECONDS Run SECONDS after the last deactivation\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --on-calendar=SPEC Realtime timer\n"
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho " --timer-property=NAME=VALUE Set timer unit property\n",
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering program_invocation_short_name);
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering}
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic bool with_timer(void) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return arg_on_active || arg_on_boot || arg_on_startup || arg_on_unit_active || arg_on_unit_inactive || arg_on_calendar;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho}
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poetteringstatic int parse_argv(int argc, char *argv[]) {
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering enum {
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering ARG_VERSION = 0x100,
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin ARG_NO_ASK_PASSWORD,
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering ARG_USER,
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poettering ARG_SYSTEM,
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering ARG_SCOPE,
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering ARG_UNIT,
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering ARG_DESCRIPTION,
a6c0353b9268d5b780fb7ff05a10cb5031446e5dLennart Poettering ARG_SLICE,
a6c0353b9268d5b780fb7ff05a10cb5031446e5dLennart Poettering ARG_SEND_SIGHUP,
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering ARG_EXEC_USER,
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering ARG_EXEC_GROUP,
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering ARG_SERVICE_TYPE,
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering ARG_NICE,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho ARG_SETENV,
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering ARG_TTY,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho ARG_ON_ACTIVE,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho ARG_ON_BOOT,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho ARG_ON_STARTUP,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho ARG_ON_UNIT_ACTIVE,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho ARG_ON_UNIT_INACTIVE,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho ARG_ON_CALENDAR,
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering ARG_TIMER_PROPERTY,
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering ARG_NO_BLOCK,
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering };
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering static const struct option options[] = {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "help", no_argument, NULL, 'h' },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "version", no_argument, NULL, ARG_VERSION },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "user", no_argument, NULL, ARG_USER },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "system", no_argument, NULL, ARG_SYSTEM },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "scope", no_argument, NULL, ARG_SCOPE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "unit", required_argument, NULL, ARG_UNIT },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "description", required_argument, NULL, ARG_DESCRIPTION },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "slice", required_argument, NULL, ARG_SLICE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "remain-after-exit", no_argument, NULL, 'r' },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "send-sighup", no_argument, NULL, ARG_SEND_SIGHUP },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "host", required_argument, NULL, 'H' },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "machine", required_argument, NULL, 'M' },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "service-type", required_argument, NULL, ARG_SERVICE_TYPE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "uid", required_argument, NULL, ARG_EXEC_USER },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "gid", required_argument, NULL, ARG_EXEC_GROUP },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "nice", required_argument, NULL, ARG_NICE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "setenv", required_argument, NULL, ARG_SETENV },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "property", required_argument, NULL, 'p' },
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering { "tty", no_argument, NULL, 't' },
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering { "quiet", no_argument, NULL, 'q' },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-active", required_argument, NULL, ARG_ON_ACTIVE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-boot", required_argument, NULL, ARG_ON_BOOT },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-startup", required_argument, NULL, ARG_ON_STARTUP },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-unit-active", required_argument, NULL, ARG_ON_UNIT_ACTIVE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-unit-inactive", required_argument, NULL, ARG_ON_UNIT_INACTIVE },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "on-calendar", required_argument, NULL, ARG_ON_CALENDAR },
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho { "timer-property", required_argument, NULL, ARG_TIMER_PROPERTY },
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering { "no-block", no_argument, NULL, ARG_NO_BLOCK },
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD },
eb9da376d76b48585b3b63b4f91903b54f7abd36Lennart Poettering {},
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering };
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering int r, c;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering assert(argc >= 0);
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering assert(argv);
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering while ((c = getopt_long(argc, argv, "+hrH:M:p:tq", options, NULL)) >= 0)
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering switch (c) {
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering case 'h':
601185b43da638b1c74153deae01dbd518680889Zbigniew Jędrzejewski-Szmek help();
601185b43da638b1c74153deae01dbd518680889Zbigniew Jędrzejewski-Szmek return 0;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin case ARG_NO_ASK_PASSWORD:
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin arg_ask_password = false;
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin break;
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering case ARG_VERSION:
3f6fd1ba65f962702753c4ad284b588e59689a23Lennart Poettering return version();
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering case ARG_USER:
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering arg_user = true;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering break;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poettering case ARG_SYSTEM:
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poettering arg_user = false;
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poettering break;
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering case ARG_SCOPE:
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering arg_scope = true;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering break;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering case ARG_UNIT:
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering arg_unit = optarg;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering break;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering case ARG_DESCRIPTION:
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering arg_description = optarg;
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering break;
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering case ARG_SLICE:
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering arg_slice = optarg;
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering break;
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering
a6c0353b9268d5b780fb7ff05a10cb5031446e5dLennart Poettering case ARG_SEND_SIGHUP:
a6c0353b9268d5b780fb7ff05a10cb5031446e5dLennart Poettering arg_send_sighup = true;
a6c0353b9268d5b780fb7ff05a10cb5031446e5dLennart Poettering break;
a6c0353b9268d5b780fb7ff05a10cb5031446e5dLennart Poettering
6577c7cea72f19185ad999c223bcf663c010dc6fLennart Poettering case 'r':
6577c7cea72f19185ad999c223bcf663c010dc6fLennart Poettering arg_remain_after_exit = true;
6577c7cea72f19185ad999c223bcf663c010dc6fLennart Poettering break;
6577c7cea72f19185ad999c223bcf663c010dc6fLennart Poettering
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering case 'H':
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering arg_transport = BUS_TRANSPORT_REMOTE;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering arg_host = optarg;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering break;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering case 'M':
de33fc625725d199629ed074d6278504deb23debLennart Poettering arg_transport = BUS_TRANSPORT_MACHINE;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering arg_host = optarg;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering break;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering case ARG_SERVICE_TYPE:
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering arg_service_type = optarg;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering break;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering case ARG_EXEC_USER:
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering arg_exec_user = optarg;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering break;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering case ARG_EXEC_GROUP:
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering arg_exec_group = optarg;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering break;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering case ARG_NICE:
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = safe_atoi(optarg, &arg_nice);
1ac67edb7c4d31a287fa98c0b554ae98bd34e71bLennart Poettering if (r < 0 || arg_nice < PRIO_MIN || arg_nice >= PRIO_MAX) {
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering log_error("Failed to parse nice value");
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering return -EINVAL;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering }
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering arg_nice_set = true;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering break;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering case ARG_SETENV:
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (strv_extend(&arg_environment, optarg) < 0)
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering return log_oom();
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering break;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering case 'p':
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering if (strv_extend(&arg_property, optarg) < 0)
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering return log_oom();
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering break;
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering case 't':
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering arg_pty = true;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering break;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering case 'q':
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering arg_quiet = true;
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering break;
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho case ARG_ON_ACTIVE:
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = parse_sec(optarg, &arg_on_active);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho break;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho case ARG_ON_BOOT:
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = parse_sec(optarg, &arg_on_boot);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho break;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho case ARG_ON_STARTUP:
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = parse_sec(optarg, &arg_on_startup);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho break;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho case ARG_ON_UNIT_ACTIVE:
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = parse_sec(optarg, &arg_on_unit_active);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho break;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho case ARG_ON_UNIT_INACTIVE:
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = parse_sec(optarg, &arg_on_unit_inactive);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Failed to parse timer value: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho break;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering case ARG_ON_CALENDAR: {
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering CalendarSpec *spec = NULL;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = calendar_spec_from_string(optarg, &spec);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Invalid calendar spec: %s", optarg);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering calendar_spec_free(spec);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho arg_on_calendar = optarg;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho break;
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho case ARG_TIMER_PROPERTY:
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (strv_extend(&arg_timer_property, optarg) < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return log_oom();
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho break;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering case ARG_NO_BLOCK:
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering arg_no_block = true;
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering break;
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering case '?':
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering return -EINVAL;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering default:
eb9da376d76b48585b3b63b4f91903b54f7abd36Lennart Poettering assert_not_reached("Unhandled option");
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering }
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if ((optind >= argc) && (!arg_unit || !with_timer())) {
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering log_error("Command line to execute required.");
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering return -EINVAL;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering }
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering if (arg_user && arg_transport != BUS_TRANSPORT_LOCAL) {
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering log_error("Execution in user context is not supported on non-local systems.");
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering return -EINVAL;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering }
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering if (arg_scope && arg_transport != BUS_TRANSPORT_LOCAL) {
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering log_error("Scope execution is not supported on non-local systems.");
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering return -EINVAL;
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering }
d21ed1ead18d16d35c30299a69d3366847f8a039Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (arg_scope && (arg_remain_after_exit || arg_service_type)) {
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering log_error("--remain-after-exit and --service-type= are not supported in --scope mode.");
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering return -EINVAL;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering }
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (arg_pty && (with_timer() || arg_scope)) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering log_error("--pty is not compatible in timer or --scope mode.");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return -EINVAL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering }
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering if (arg_pty && arg_transport == BUS_TRANSPORT_REMOTE) {
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering log_error("--pty is only supported when connecting to the local system or containers.");
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering return -EINVAL;
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering }
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_scope && with_timer()) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("Timer options are not supported in --scope mode.");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return -EINVAL;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_timer_property && !with_timer()) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho log_error("--timer-property= has no effect without any other timer options.");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return -EINVAL;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering return 1;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering}
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_unit_set_properties(sd_bus_message *m, char **properties) {
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering char **i;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering int r;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m, "(sv)", "Description", "s", arg_description);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering STRV_FOREACH(i, properties) {
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering r = bus_append_unit_property_assignment(m, *i);
8962620e5e7d6a8ffde1fe363f13dd82b1a15661Lennart Poettering if (r < 0)
8962620e5e7d6a8ffde1fe363f13dd82b1a15661Lennart Poettering return r;
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering }
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return 0;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering}
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_cgroup_set_properties(sd_bus_message *m) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering int r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering assert(m);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering if (!isempty(arg_slice)) {
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering _cleanup_free_ char *slice;
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_slice, UNIT_NAME_NOGLOB, ".slice", &slice);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering if (r < 0)
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return r;
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering r = sd_bus_message_append(m, "(sv)", "Slice", "s", slice);
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering if (r < 0)
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering return r;
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering }
c221420be8744bb0f8b8a8145efc1f247f1aa801Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return 0;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering}
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_kill_set_properties(sd_bus_message *m) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering assert(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
aa1aad74e6b14730542c26a7c17c5d06c62b6089Zbigniew Jędrzejewski-Szmek if (arg_send_sighup)
aa1aad74e6b14730542c26a7c17c5d06c62b6089Zbigniew Jędrzejewski-Szmek return sd_bus_message_append(m, "(sv)", "SendSIGHUP", "b", arg_send_sighup);
aa1aad74e6b14730542c26a7c17c5d06c62b6089Zbigniew Jędrzejewski-Szmek else
aa1aad74e6b14730542c26a7c17c5d06c62b6089Zbigniew Jędrzejewski-Szmek return 0;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering}
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_service_set_properties(sd_bus_message *m, char **argv, const char *pty_path) {
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering int r;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
8159d91a9c92aaee66d450ab0daff88f6e1a42b3Lennart Poettering assert(m);
8159d91a9c92aaee66d450ab0daff88f6e1a42b3Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_unit_set_properties(m, arg_property);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_kill_set_properties(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_cgroup_set_properties(m);
86b8d289717bad2800342efca0a5023aa8374e9cLennart Poettering if (r < 0)
86b8d289717bad2800342efca0a5023aa8374e9cLennart Poettering return r;
86b8d289717bad2800342efca0a5023aa8374e9cLennart Poettering
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering if (arg_remain_after_exit) {
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering r = sd_bus_message_append(m, "(sv)", "RemainAfterExit", "b", arg_remain_after_exit);
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering }
6577c7cea72f19185ad999c223bcf663c010dc6fLennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (arg_service_type) {
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "(sv)", "Type", "s", arg_service_type);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering }
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (arg_exec_user) {
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "(sv)", "User", "s", arg_exec_user);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering }
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (arg_exec_group) {
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "(sv)", "Group", "s", arg_exec_group);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering }
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (arg_nice_set) {
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "(sv)", "Nice", "i", arg_nice);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering }
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (pty_path) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering const char *e;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m,
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "(sv)(sv)(sv)(sv)",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "StandardInput", "s", "tty",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "StandardOutput", "s", "tty",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "StandardError", "s", "tty",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "TTYPath", "s", pty_path);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering e = getenv("TERM");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (e) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering char *n;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
63c372cb9df3bee01e3bf8cd7f96f336bddda846Lennart Poettering n = strjoina("TERM=", e);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m,
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "(sv)",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "Environment", "as", 1, n);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering }
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering }
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (!strv_isempty(arg_environment)) {
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_open_container(m, 'r', "sv");
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append(m, "s", "Environment");
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_open_container(m, 'v', "as");
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_append_strv(m, arg_environment);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_close_container(m);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering r = sd_bus_message_close_container(m);
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho /* Exec container */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'r', "sv");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "s", "ExecStart");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'v', "a(sasb)");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'a', "(sasb)");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'r', "sasb");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "s", argv[0]);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append_strv(m, argv);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "b", false);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_close_container(m);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_close_container(m);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_close_container(m);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_close_container(m);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return 0;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho}
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int transient_scope_set_properties(sd_bus_message *m) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering int r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering assert(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_unit_set_properties(m, arg_property);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_kill_set_properties(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m, "(sv)", "PIDs", "au", 1, (uint32_t) getpid());
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return 0;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering}
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic int transient_timer_set_properties(sd_bus_message *m) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho int r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho assert(m);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_unit_set_properties(m, arg_timer_property);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
6348d701bd24afcca4857417e66756f752f02136Lennart Poettering /* Automatically clean up our transient timers */
6348d701bd24afcca4857417e66756f752f02136Lennart Poettering r = sd_bus_message_append(m, "(sv)", "RemainAfterElapse", "b", false);
6348d701bd24afcca4857417e66756f752f02136Lennart Poettering if (r < 0)
6348d701bd24afcca4857417e66756f752f02136Lennart Poettering return r;
6348d701bd24afcca4857417e66756f752f02136Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_on_active) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnActiveSec", "t", arg_on_active);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering }
c7040b5d1c2c148f12b6a5eef3dfce1661805131Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_on_boot) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnBootSec", "t", arg_on_boot);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_on_startup) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnStartupSec", "t", arg_on_startup);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_on_unit_active) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnUnitActiveSec", "t", arg_on_unit_active);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_on_unit_inactive) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnUnitInactiveSec", "t", arg_on_unit_inactive);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_on_calendar) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "(sv)", "OnCalendar", "s", arg_on_calendar);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return 0;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho}
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poetteringstatic int make_unit_name(sd_bus *bus, UnitType t, char **ret) {
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering const char *unique, *id;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering char *p;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering int r;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering assert(bus);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering assert(t >= 0);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering assert(t < _UNIT_TYPE_MAX);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = sd_bus_get_unique_name(bus, &unique);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (r < 0) {
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering sd_id128_t rnd;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering /* We couldn't get the unique name, which is a pretty
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering * common case if we are connected to systemd
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering * directly. In that case, just pick a random uuid as
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering * name */
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = sd_id128_randomize(&rnd);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (r < 0)
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return log_error_errno(r, "Failed to generate random run unit name: %m");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (asprintf(ret, "run-r" SD_ID128_FORMAT_STR ".%s", SD_ID128_FORMAT_VAL(rnd), unit_type_to_string(t)) < 0)
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return log_oom();
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return 0;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering }
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering /* We managed to get the unique name, then let's use that to
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering * name our transient units. */
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering id = startswith(unique, ":1.");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (!id) {
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering log_error("Unique name %s has unexpected format.", unique);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return -EINVAL;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering }
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering p = strjoin("run-u", id, ".", unit_type_to_string(t), NULL);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (!p)
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return log_oom();
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering *ret = p;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return 0;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering}
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Chostatic int start_transient_service(
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho sd_bus *bus,
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering char **argv) {
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering _cleanup_free_ char *service = NULL, *pty_path = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _cleanup_close_ int master = -1;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho int r;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho assert(bus);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho assert(argv);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (arg_pty) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (arg_transport == BUS_TRANSPORT_LOCAL) {
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering master = posix_openpt(O_RDWR|O_NOCTTY|O_CLOEXEC|O_NDELAY);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (master < 0)
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return log_error_errno(errno, "Failed to acquire pseudo tty: %m");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = ptsname_malloc(master, &pty_path);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (r < 0)
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return log_error_errno(r, "Failed to determine tty name: %m");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering
395745ba533ac91fe118f43ec83f13a752c0b473Lennart Poettering if (unlockpt(master) < 0)
395745ba533ac91fe118f43ec83f13a752c0b473Lennart Poettering return log_error_errno(errno, "Failed to unlock tty: %m");
395745ba533ac91fe118f43ec83f13a752c0b473Lennart Poettering
de33fc625725d199629ed074d6278504deb23debLennart Poettering } else if (arg_transport == BUS_TRANSPORT_MACHINE) {
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_unrefp) sd_bus *system_bus = NULL;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering const char *s;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering r = sd_bus_default_system(&system_bus);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (r < 0)
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering return log_error_errno(r, "Failed to connect to system bus: %m");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = sd_bus_call_method(system_bus,
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering "org.freedesktop.machine1",
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering "/org/freedesktop/machine1",
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering "org.freedesktop.machine1.Manager",
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering "OpenMachinePTY",
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering &error,
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering &reply,
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering "s", arg_host);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (r < 0) {
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering log_error("Failed to get machine PTY: %s", bus_error_message(&error, -r));
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return r;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering }
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = sd_bus_message_read(reply, "hs", &master, &s);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (r < 0)
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return bus_log_parse_error(r);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering reply = sd_bus_message_unref(reply);
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering master = fcntl(master, F_DUPFD_CLOEXEC, 3);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (master < 0)
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return log_error_errno(errno, "Failed to duplicate master fd: %m");
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering pty_path = strdup(s);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (!pty_path)
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return log_oom();
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering } else
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering assert_not_reached("Can't allocate tty via ssh");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering }
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering if (!arg_no_block) {
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering r = bus_wait_for_jobs_new(bus, &w);
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering if (r < 0)
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering return log_error_errno(r, "Could not watch jobs: %m");
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering }
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_unit) {
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_unit, UNIT_NAME_NOGLOB, ".service", &service);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering if (r < 0)
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to mangle unit name: %m");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering } else {
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = make_unit_name(bus, UNIT_SERVICE, &service);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (r < 0)
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return r;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_new_method_call(
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho bus,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho &m,
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "org.freedesktop.systemd1",
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "/org/freedesktop/systemd1",
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "org.freedesktop.systemd1.Manager",
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho "StartTransientUnit");
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering if (r < 0)
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return bus_log_create_error(r);
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin if (r < 0)
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin return bus_log_create_error(r);
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Name and mode */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "ss", service, "fail");
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering if (r < 0)
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return bus_log_create_error(r);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Properties */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'a', "(sv)");
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering if (r < 0)
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return bus_log_create_error(r);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_service_set_properties(m, argv, pty_path);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering if (r < 0)
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return bus_log_create_error(r);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_close_container(m);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering if (r < 0)
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return bus_log_create_error(r);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Auxiliary units */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "a(sa(sv))", 0);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering if (r < 0)
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return bus_log_create_error(r);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin polkit_agent_open_if_enabled();
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering r = sd_bus_call(bus, m, 0, &error, &reply);
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering if (r < 0)
024a8ec137f17cbbc22256ef4aa7f99ec671dbc5Lennart Poettering return log_error_errno(r, "Failed to start transient service unit: %s", bus_error_message(&error, r));
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering if (w) {
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering const char *object;
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering r = sd_bus_message_read(reply, "o", &object);
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering if (r < 0)
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering return bus_log_parse_error(r);
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering r = bus_wait_for_jobs_one(w, object, arg_quiet);
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering if (r < 0)
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering return r;
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering }
3d161f991e16369aa59f447eb4cdb90af33261c8Lennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (master >= 0) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _cleanup_(pty_forward_freep) PTYForward *forward = NULL;
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_event_unrefp) sd_event *event = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering char last_char = 0;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_event_default(&event);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_error_errno(r, "Failed to get event loop: %m");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
72c0a2c255b172ebbb2a2b7dab7c9aec4c9582d9Lennart Poettering assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGWINCH, SIGTERM, SIGINT, -1) >= 0);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
72c0a2c255b172ebbb2a2b7dab7c9aec4c9582d9Lennart Poettering (void) sd_event_add_signal(event, NULL, SIGINT, NULL, NULL);
72c0a2c255b172ebbb2a2b7dab7c9aec4c9582d9Lennart Poettering (void) sd_event_add_signal(event, NULL, SIGTERM, NULL, NULL);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering if (!arg_quiet)
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering log_info("Running as unit %s.\nPress ^] three times within 1s to disconnect TTY.", service);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
ae3dde801253b1d5f7363bb9fb06bcb230f00eb8Lennart Poettering r = pty_forward_new(event, master, PTY_FORWARD_IGNORE_INITIAL_VHANGUP, &forward);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_error_errno(r, "Failed to create PTY forwarder: %m");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_event_loop(event);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_error_errno(r, "Failed to run event loop: %m");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
0ec5543c4c0318552a4dcdd83210793347b93081Lennart Poettering pty_forward_get_last_char(forward, &last_char);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering forward = pty_forward_free(forward);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering if (!arg_quiet && last_char != '\n')
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering fputc('\n', stdout);
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering } else if (!arg_quiet)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering log_info("Running as unit %s.", service);
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return 0;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering}
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poetteringstatic int start_transient_scope(
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering sd_bus *bus,
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering char **argv) {
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _cleanup_strv_free_ char **env = NULL, **user_env = NULL;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho _cleanup_free_ char *scope = NULL;
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering const char *object = NULL;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering int r;
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
8159d91a9c92aaee66d450ab0daff88f6e1a42b3Lennart Poettering assert(bus);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho assert(argv);
8159d91a9c92aaee66d450ab0daff88f6e1a42b3Lennart Poettering
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = bus_wait_for_jobs_new(bus, &w);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering if (r < 0)
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering return log_oom();
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering
7de80bfe2e61d5818601ccfddbadad3b7703ed70Karel Zak if (arg_unit) {
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_unit, UNIT_NAME_NOGLOB, ".scope", &scope);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering if (r < 0)
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to mangle scope name: %m");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering } else {
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = make_unit_name(bus, UNIT_SCOPE, &scope);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (r < 0)
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return r;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering }
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_new_method_call(
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering bus,
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering &m,
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "org.freedesktop.systemd1",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "/org/freedesktop/systemd1",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "org.freedesktop.systemd1.Manager",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "StartTransientUnit");
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering if (r < 0)
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return bus_log_create_error(r);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin if (r < 0)
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin return bus_log_create_error(r);
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Name and Mode */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "ss", scope, "fail");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return bus_log_create_error(r);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Properties */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_open_container(m, 'a', "(sv)");
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return bus_log_create_error(r);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = transient_scope_set_properties(m);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return bus_log_create_error(r);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_close_container(m);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho return bus_log_create_error(r);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering /* Auxiliary units */
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho r = sd_bus_message_append(m, "a(sa(sv))", 0);
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering if (r < 0)
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering return bus_log_create_error(r);
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin polkit_agent_open_if_enabled();
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = sd_bus_call(bus, m, 0, &error, &reply);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (r < 0) {
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering log_error("Failed to start transient scope unit: %s", bus_error_message(&error, -r));
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return r;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering }
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (arg_nice_set) {
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt if (setpriority(PRIO_PROCESS, 0, arg_nice) < 0)
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to set nice level: %m");
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering }
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (arg_exec_group) {
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering gid_t gid;
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = get_group_creds(&arg_exec_group, &gid);
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt if (r < 0)
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt return log_error_errno(r, "Failed to resolve group %s: %m", arg_exec_group);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt if (setresgid(gid, gid, gid) < 0)
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to change GID to " GID_FMT ": %m", gid);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering }
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (arg_exec_user) {
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering const char *home, *shell;
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering uid_t uid;
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering gid_t gid;
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = get_user_creds(&arg_exec_user, &uid, &gid, &home, &shell);
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt if (r < 0)
f647962d64e844689f3e2acfce6102fc47e76df2Michal Schmidt return log_error_errno(r, "Failed to resolve user %s: %m", arg_exec_user);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = strv_extendf(&user_env, "HOME=%s", home);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (r < 0)
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering return log_oom();
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = strv_extendf(&user_env, "SHELL=%s", shell);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (r < 0)
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering return log_oom();
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = strv_extendf(&user_env, "USER=%s", arg_exec_user);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (r < 0)
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering return log_oom();
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering r = strv_extendf(&user_env, "LOGNAME=%s", arg_exec_user);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (r < 0)
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering return log_oom();
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (!arg_exec_group) {
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt if (setresgid(gid, gid, gid) < 0)
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to change GID to " GID_FMT ": %m", gid);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering }
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt if (setresuid(uid, uid, uid) < 0)
4a62c710b62a5a3c7a8a278b810b9d5b5a0c8f4fMichal Schmidt return log_error_errno(errno, "Failed to change UID to " UID_FMT ": %m", uid);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering }
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering env = strv_env_merge(3, environ, user_env, arg_environment);
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering if (!env)
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering return log_oom();
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = sd_bus_message_read(reply, "o", &object);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering if (r < 0)
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering return bus_log_parse_error(r);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = bus_wait_for_jobs_one(w, object, arg_quiet);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering if (r < 0)
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering return r;
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering
095dc59660c3dde782f32fe5a52b577f7700578bLennart Poettering if (!arg_quiet)
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering log_info("Running scope as unit %s.", scope);
7040b626e82d65dc48a4e464965e15ec7f529aecLennart Poettering
4de33e7f3238a6fe616e61139ab87e221572e5e5Lennart Poettering execvpe(argv[0], argv, env);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_error_errno(errno, "Failed to execute: %m");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering}
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poetteringstatic int start_transient_timer(
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering sd_bus *bus,
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering char **argv) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering _cleanup_(bus_wait_for_jobs_freep) BusWaitForJobs *w = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering _cleanup_free_ char *timer = NULL, *service = NULL;
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering const char *object = NULL;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering int r;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering assert(bus);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering assert(argv);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = bus_wait_for_jobs_new(bus, &w);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering if (r < 0)
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering return log_oom();
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (arg_unit) {
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering switch (unit_name_to_type(arg_unit)) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering case UNIT_SERVICE:
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering service = strdup(arg_unit);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (!service)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_oom();
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_change_suffix(service, ".timer", &timer);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering if (r < 0)
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to change unit suffix: %m");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering break;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering case UNIT_TIMER:
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering timer = strdup(arg_unit);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (!timer)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return log_oom();
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_change_suffix(timer, ".service", &service);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering if (r < 0)
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to change unit suffix: %m");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering break;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering default:
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_unit, UNIT_NAME_NOGLOB, ".service", &service);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering if (r < 0)
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to mangle unit name: %m");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering r = unit_name_mangle_with_suffix(arg_unit, UNIT_NAME_NOGLOB, ".timer", &timer);
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering if (r < 0)
7410616cd9dbbec97cf98d75324da5cda2b2f7a2Lennart Poettering return log_error_errno(r, "Failed to mangle unit name: %m");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering break;
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering }
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering } else {
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = make_unit_name(bus, UNIT_SERVICE, &service);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (r < 0)
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return r;
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering r = unit_name_change_suffix(service, ".timer", &timer);
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering if (r < 0)
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering return log_error_errno(r, "Failed to change unit suffix: %m");
9c8d1e1a712d443c456147e15ee906035b5fa0f7Lennart Poettering }
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_new_method_call(
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering bus,
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering &m,
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "org.freedesktop.systemd1",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "/org/freedesktop/systemd1",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "org.freedesktop.systemd1.Manager",
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering "StartTransientUnit");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin r = sd_bus_message_set_allow_interactive_authorization(m, arg_ask_password);
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin if (r < 0)
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin return bus_log_create_error(r);
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Name and Mode */
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m, "ss", timer, "fail");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering /* Properties */
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_open_container(m, 'a', "(sv)");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_timer_set_properties(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_close_container(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_open_container(m, 'a', "(sa(sv))");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (argv[0]) {
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_open_container(m, 'r', "sa(sv)");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_append(m, "s", service);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_open_container(m, 'a', "(sv)");
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = transient_service_set_properties(m, argv, NULL);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_close_container(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_close_container(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering }
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering r = sd_bus_message_close_container(m);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (r < 0)
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return bus_log_create_error(r);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin polkit_agent_open_if_enabled();
8c7db2fb2186277f9572d58b664cc59792ee4f50Evgeny Vereshchagin
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = sd_bus_call(bus, m, 0, &error, &reply);
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering if (r < 0) {
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering log_error("Failed to start transient timer unit: %s", bus_error_message(&error, -r));
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering return r;
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering }
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = sd_bus_message_read(reply, "o", &object);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering if (r < 0)
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering return bus_log_parse_error(r);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering r = bus_wait_for_jobs_one(w, object, arg_quiet);
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering if (r < 0)
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering return r;
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering log_info("Running timer as unit %s.", timer);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering if (argv[0])
de158ed22db60e3a6654557fa4aa72f7248550afLennart Poettering log_info("Will run service as unit %s.", service);
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering
9b15b7846d4de01bb5d9700a24077787e984e8abLennart Poettering return 0;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering}
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poetteringint main(int argc, char* argv[]) {
4afd3348c7506dd1d36305b7bcb9feb8952b9d6bLennart Poettering _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
c9d954b27ee125c3c90a6d2951c62eec4abb160bZbigniew Jędrzejewski-Szmek _cleanup_free_ char *description = NULL, *command = NULL;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering int r;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering log_parse_environment();
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering log_open();
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering r = parse_argv(argc, argv);
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering if (r <= 0)
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poettering goto finish;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering if (argc > optind && arg_transport == BUS_TRANSPORT_LOCAL) {
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering /* Patch in an absolute path */
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering r = find_binary(argv[optind], &command);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (r < 0) {
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering log_error_errno(r, "Failed to find executable %s: %m", argv[optind]);
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering goto finish;
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering }
85eca92e2061043d733991b386d8dc10fad0fc30Lennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho argv[optind] = command;
c9d954b27ee125c3c90a6d2951c62eec4abb160bZbigniew Jędrzejewski-Szmek }
c9d954b27ee125c3c90a6d2951c62eec4abb160bZbigniew Jędrzejewski-Szmek
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering if (!arg_description) {
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering description = strv_join(argv + optind, " ");
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering if (!description) {
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering r = log_oom();
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poettering goto finish;
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering }
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho if (arg_unit && isempty(description)) {
2fc09a9cdd1ad25bc7c53a23d5301eb952e1ce3dDaniel Mack r = free_and_strdup(&description, arg_unit);
2fc09a9cdd1ad25bc7c53a23d5301eb952e1ce3dDaniel Mack if (r < 0)
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho goto finish;
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho }
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering arg_description = description;
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering }
9f2e86af0600e99cff00d1c92f9bb8d38f29896aLennart Poettering
266f3e269d173f104aa2a5e3ceac9b6979ea5039Lennart Poettering r = bus_connect_transport_systemd(arg_transport, arg_host, arg_user, &bus);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering if (r < 0) {
da927ba997d68401563b927f92e6e40e021a8e5cMichal Schmidt log_error_errno(r, "Failed to create bus connection: %m");
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poettering goto finish;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering }
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering if (arg_scope)
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = start_transient_scope(bus, argv + optind);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho else if (with_timer())
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = start_transient_timer(bus, argv + optind);
6c12b52e19640747e96f89d85422941a23dc6b29Lennart Poettering else
ee451d766a64117a41ec36dd71e61683c9d9b83cLennart Poettering r = start_transient_service(bus, argv + optind);
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering
66b1e746055b9c56fd72c0451a4cfb2b06cf3f20Lennart Poetteringfinish:
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering strv_free(arg_environment);
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering strv_free(arg_property);
4c213d6cf416917c61f82d8bee795b8f3a4c5372WaLyong Cho strv_free(arg_timer_property);
df31a6c0fe07805cb50045fbe91c2a6e7e430562Lennart Poettering
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
c2756a68401102786be343712c0c35acbd73d28dLennart Poettering}