diff options
-rw-r--r-- | man/hostnamectl.xml | 25 | ||||
-rw-r--r-- | src/hostname/hostnamectl.c | 106 | ||||
-rw-r--r-- | src/test/test-libudev.c | 2 |
3 files changed, 100 insertions, 33 deletions
diff --git a/man/hostnamectl.xml b/man/hostnamectl.xml index f28e430a42..b39fb5502b 100644 --- a/man/hostnamectl.xml +++ b/man/hostnamectl.xml @@ -49,7 +49,9 @@ <refsynopsisdiv> <cmdsynopsis> - <command>hostnamectl <arg choice="opt" rep="repeat">OPTIONS</arg> <arg choice="req">COMMAND</arg></command> + <command>hostnamectl</command> + <arg choice="opt" rep="repeat">OPTIONS</arg> + <arg choice="req">COMMAND</arg> </cmdsynopsis> </refsynopsisdiv> @@ -81,7 +83,7 @@ <filename>/etc/hostname</filename>, see <citerefentry><refentrytitle>hostname</refentrytitle><manvolnum>5</manvolnum></citerefentry> for more information. The pretty hostname, chassis - type and icon name are stored in + type, and icon name are stored in <filename>/etc/machine-info</filename>, see <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para> </refsect1> @@ -141,11 +143,20 @@ <term><option>--pretty</option></term> <listitem><para>If - <command>set-hostname</command> is - invoked and one or more of these - options are passed, only the selected - hostname(s) is/are - updated.</para></listitem> + <command>status</command> is used (or + no explicit command is given) and one + of those fields is given, + <command>hostnamectl</command> will + print out just this selected + hostname.</para> + + <para>If used with + <command>set-hostname</command>, only + the selected hostname(s) will be + updated. When more than one of those + options is used, all the specified + hostnames will be updated. + </para></listitem> </varlistentry> </variablelist> diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index f7d844b975..66015c2f4c 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -46,9 +46,9 @@ static enum transport { static bool arg_ask_password = true; static char *arg_host = NULL; static char *arg_user = NULL; -static bool arg_set_transient = false; -static bool arg_set_pretty = false; -static bool arg_set_static = false; +static bool arg_transient = false; +static bool arg_pretty = false; +static bool arg_static = false; static void polkit_agent_open_if_enabled(void) { @@ -152,15 +152,52 @@ static int status_property(const char *name, DBusMessageIter *iter, StatusInfo * return 0; } -static int show_status(DBusConnection *bus, char **args, unsigned n) { +static int show_one_name(DBusConnection *bus, const char* attr) { + _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; + const char *interface = "org.freedesktop.hostname1", *s; + DBusMessageIter iter, sub; + int r; + + r = bus_method_call_with_reply( + bus, + "org.freedesktop.hostname1", + "/org/freedesktop/hostname1", + "org.freedesktop.DBus.Properties", + "Get", + &reply, + NULL, + DBUS_TYPE_STRING, &interface, + DBUS_TYPE_STRING, &attr, + DBUS_TYPE_INVALID); + if (r < 0) + return r; + + if (!dbus_message_iter_init(reply, &iter) || + dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { + log_error("Failed to parse reply."); + return -EIO; + } + + dbus_message_iter_recurse(&iter, &sub); + + if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING) { + log_error("Failed to parse reply."); + return -EIO; + } + + dbus_message_iter_get_basic(&sub, &s); + printf("%s\n", s); + + return 0; +} + +static int show_all_names(DBusConnection *bus) { _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; const char *interface = ""; int r; DBusMessageIter iter, sub, sub2, sub3; StatusInfo info = {}; - assert(args); - r = bus_method_call_with_reply( bus, "org.freedesktop.hostname1", @@ -218,6 +255,25 @@ static int show_status(DBusConnection *bus, char **args, unsigned n) { return 0; } +static int show_status(DBusConnection *bus, char **args, unsigned n) { + assert(args); + + if (arg_pretty || arg_static || arg_transient) { + const char *attr; + + if (!!arg_static + !!arg_pretty + !!arg_transient > 1) { + log_error("Cannot query more than one name type at a time"); + return -EINVAL; + } + + attr = arg_pretty ? "PrettyHostname" : + arg_static ? "StaticHostname" : "Hostname"; + + return show_one_name(bus, attr); + } else + return show_all_names(bus); +} + static int set_hostname(DBusConnection *bus, char **args, unsigned n) { _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; dbus_bool_t interactive = arg_ask_password; @@ -230,7 +286,10 @@ static int set_hostname(DBusConnection *bus, char **args, unsigned n) { polkit_agent_open_if_enabled(); - if (arg_set_pretty) { + if (!arg_pretty && !arg_static && !arg_transient) + arg_pretty = arg_static = arg_transient = true; + + if (arg_pretty) { const char *p; /* If the passed hostname is already valid, then @@ -245,7 +304,7 @@ static int set_hostname(DBusConnection *bus, char **args, unsigned n) { hostname_cleanup(h, true); - if (arg_set_static && streq(h, hostname)) + if (arg_static && streq(h, hostname)) p = ""; else { p = hostname; @@ -270,7 +329,7 @@ static int set_hostname(DBusConnection *bus, char **args, unsigned n) { reply = NULL; } - if (arg_set_static) { + if (arg_static) { r = bus_method_call_with_reply( bus, "org.freedesktop.hostname1", @@ -290,7 +349,7 @@ static int set_hostname(DBusConnection *bus, char **args, unsigned n) { reply = NULL; } - if (arg_set_transient) { + if (arg_transient) { r = bus_method_call_with_reply( bus, "org.freedesktop.hostname1", @@ -381,17 +440,17 @@ static int parse_argv(int argc, char *argv[]) { enum { ARG_VERSION = 0x100, ARG_NO_ASK_PASSWORD, - ARG_SET_TRANSIENT, - ARG_SET_STATIC, - ARG_SET_PRETTY + ARG_TRANSIENT, + ARG_STATIC, + ARG_PRETTY }; static const struct option options[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, ARG_VERSION }, - { "transient", no_argument, NULL, ARG_SET_TRANSIENT }, - { "static", no_argument, NULL, ARG_SET_STATIC }, - { "pretty", no_argument, NULL, ARG_SET_PRETTY }, + { "transient", no_argument, NULL, ARG_TRANSIENT }, + { "static", no_argument, NULL, ARG_STATIC }, + { "pretty", no_argument, NULL, ARG_PRETTY }, { "host", required_argument, NULL, 'H' }, { "privileged", no_argument, NULL, 'P' }, { "no-ask-password", no_argument, NULL, ARG_NO_ASK_PASSWORD }, @@ -425,16 +484,16 @@ static int parse_argv(int argc, char *argv[]) { parse_user_at_host(optarg, &arg_user, &arg_host); break; - case ARG_SET_TRANSIENT: - arg_set_transient = true; + case ARG_TRANSIENT: + arg_transient = true; break; - case ARG_SET_PRETTY: - arg_set_pretty = true; + case ARG_PRETTY: + arg_pretty = true; break; - case ARG_SET_STATIC: - arg_set_static = true; + case ARG_STATIC: + arg_static = true; break; case ARG_NO_ASK_PASSWORD: @@ -450,9 +509,6 @@ static int parse_argv(int argc, char *argv[]) { } } - if (!arg_set_transient && !arg_set_pretty && !arg_set_static) - arg_set_transient = arg_set_pretty = arg_set_static = true; - return 1; } diff --git a/src/test/test-libudev.c b/src/test/test-libudev.c index caa3b4d14c..716767ba5f 100644 --- a/src/test/test-libudev.c +++ b/src/test/test-libudev.c @@ -430,7 +430,7 @@ static int test_enumerate(struct udev *udev, const char *subsystem) } static int test_hwdb(struct udev *udev, const char *modalias) { - struct udev_hwdb * hwdb; + struct udev_hwdb *hwdb; struct udev_list_entry *entry; hwdb = udev_hwdb_new(udev); |