#include <fcntl.h>
#include <sys/socket.h>
#include <sys/stat.h>
+#include <stddef.h>
#include <dbus/dbus.h>
#include "exit-status.h"
#include "bus-errors.h"
#include "build.h"
+#include "unit-name.h"
static const char *arg_type = NULL;
static char **arg_property = NULL;
if (!output_show_job(u))
continue;
- if (!streq(u->load_state, "loaded")) {
+ if (!streq(u->load_state, "loaded") &&
+ !streq(u->load_state, "banned")) {
on_loaded = ansi_highlight(true);
off_loaded = ansi_highlight(false);
} else
const char *sub_state;
const char *description;
+ const char *following;
const char *path;
const char *default_control_group;
pid_t control_pid;
const char *status_text;
bool running:1;
+#ifdef HAVE_SYSV_COMPAT
bool is_sysv:1;
+#endif
usec_t start_timestamp;
usec_t exit_timestamp;
printf("\n");
- if (streq_ptr(i->load_state, "failed")) {
+ if (i->following)
+ printf("\t Follow: unit currently follows state of %s\n", i->following);
+
+ if (streq_ptr(i->load_state, "failed") ||
+ streq_ptr(i->load_state, "banned")) {
on = ansi_highlight(true);
off = ansi_highlight(false);
} else
s2 = format_timestamp(since2, sizeof(since2), timestamp);
if (s1)
- printf(" since [%s; %s]\n", s2, s1);
+ printf(" since %s; %s\n", s2, s1);
else if (s2)
- printf(" since [%s]\n", s2);
+ printf(" since %s\n", s2);
else
printf("\n");
printf("status=%i", p->status);
+#ifdef HAVE_SYSV_COMPAT
if ((c = exit_status_to_string(p->status, i->is_sysv ? EXIT_STATUS_LSB : EXIT_STATUS_SYSTEMD)))
+#else
+ if ((c = exit_status_to_string(p->status, EXIT_STATUS_SYSTEMD)))
+#endif
printf("/%s", c);
} else
printf("status=%i", i->exit_status);
+#ifdef HAVE_SYSV_COMPAT
if ((c = exit_status_to_string(i->exit_status, i->is_sysv ? EXIT_STATUS_LSB : EXIT_STATUS_SYSTEMD)))
+#else
+ if ((c = exit_status_to_string(i->exit_status, EXIT_STATUS_SYSTEMD)))
+#endif
printf("/%s", c);
} else
i->description = s;
else if (streq(name, "FragmentPath"))
i->path = s;
+#ifdef HAVE_SYSV_COMPAT
else if (streq(name, "SysVPath")) {
i->is_sysv = true;
i->path = s;
- } else if (streq(name, "DefaultControlGroup"))
+ }
+#endif
+ else if (streq(name, "DefaultControlGroup"))
i->default_control_group = s;
else if (streq(name, "StatusText"))
i->status_text = s;
i->where = s;
else if (streq(name, "What"))
i->what = s;
+ else if (streq(name, "Following"))
+ i->following = s;
}
break;
return 0;
}
+ case DBUS_TYPE_DOUBLE: {
+ double d;
+ dbus_message_iter_get_basic(iter, &d);
+
+ printf("%s=%g\n", name, d);
+ return 0;
+ }
+
case DBUS_TYPE_STRUCT: {
DBusMessageIter sub;
dbus_message_iter_recurse(iter, &sub);
static Hashmap *will_install = NULL, *have_installed = NULL;
static Set *remove_symlinks_to = NULL;
+static unsigned n_symlinks = 0;
static void install_info_free(InstallInfo *i) {
assert(i);
hashmap_free(m);
}
-static bool unit_name_valid(const char *name) {
-
- /* This is a minimal version of unit_name_valid() from
- * unit-name.c */
-
- if (!*name)
- return false;
-
- if (ignore_file(name))
- return false;
-
- return true;
-}
-
static int install_info_add(const char *name) {
InstallInfo *i;
int r;
assert(will_install);
- if (!unit_name_valid(name))
+ if (!unit_name_is_valid_no_type(name, true)) {
+ log_warning("Unit name %s is not a valid unit name.", name);
return -EINVAL;
+ }
if (hashmap_get(have_installed, name) ||
hashmap_get(will_install, name))
if (!(n = strndup(w, l)))
return -ENOMEM;
- r = install_info_add(n);
- free(n);
-
- if (r < 0)
+ if ((r = install_info_add(n)) < 0) {
+ log_warning("Cannot install unit %s: %s", n, strerror(-r));
+ free(n);
return r;
+ }
+
+ free(n);
}
return 0;
STRV_FOREACH(s, i->aliases) {
- if (!unit_name_valid(*s)) {
- log_error("Invalid name %s.", *s);
- r = -EINVAL;
- goto finish;
- }
-
free(alias_path);
if (!(alias_path = path_make_absolute(*s, config_path))) {
log_error("Out of memory");
if (streq(verb, "disable"))
rmdir_parents(alias_path, config_path);
}
-
r = 0;
finish:
assert(config_path);
STRV_FOREACH(s, i->wanted_by) {
- if (!unit_name_valid(*s)) {
+ if (!unit_name_is_valid_no_type(*s, true)) {
log_error("Invalid name %s.", *s);
r = -EINVAL;
goto finish;
return r;
}
+ n_symlinks += strv_length(i->aliases);
+ n_symlinks += strv_length(i->wanted_by);
+
fclose(f);
if ((r = install_info_symlink_alias(verb, i, config_path)) != 0)
}
for (j = 1; j < n; j++)
- if ((r = install_info_add(args[j])) < 0)
+ if ((r = install_info_add(args[j])) < 0) {
+ log_warning("Cannot install unit %s: %s", args[j], strerror(-r));
goto finish;
+ }
while ((i = hashmap_first(will_install))) {
int q;
if (streq(verb, "is-enabled"))
r = r > 0 ? 0 : -ENOENT;
- else if (bus &&
- /* Don't try to reload anything if the user asked us to not do this */
- !arg_no_reload &&
- /* Don't try to reload anything when updating a unit globally */
- !arg_global &&
- /* Don't try to reload anything if we are called for system changes but the system wasn't booted with systemd */
- (arg_session || sd_booted() > 0) &&
- /* Don't try to reload anything if we are running in a chroot environment */
- (arg_session || running_in_chroot() <= 0) ) {
- int q;
+ else {
+ if (n_symlinks <= 0)
+ log_warning("Unit files contain no applicable installation information. Ignoring.");
+
+ if (bus &&
+ /* Don't try to reload anything if the user asked us to not do this */
+ !arg_no_reload &&
+ /* Don't try to reload anything when updating a unit globally */
+ !arg_global &&
+ /* Don't try to reload anything if we are called for system changes but the system wasn't booted with systemd */
+ (arg_session || sd_booted() > 0) &&
+ /* Don't try to reload anything if we are running in a chroot environment */
+ (arg_session || running_in_chroot() <= 0) ) {
+ int q;
- if ((q = daemon_reload(bus, args, n)) < 0)
- r = q;
+ if ((q = daemon_reload(bus, args, n)) < 0)
+ r = q;
+ }
}
finish:
zero(msghdr);
msghdr.msg_name = &sockaddr;
- msghdr.msg_namelen = sizeof(sa_family_t) + 1 + sizeof("/org/freedesktop/systemd1/shutdownd") - 1;
+ msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + 1 + sizeof("/org/freedesktop/systemd1/shutdownd") - 1;
msghdr.msg_iov = &iovec;
msghdr.msg_iovlen = 1;