chiark / gitweb /
hostnamectl: show only specific hostname when requested
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 14 Aug 2013 22:55:11 +0000 (18:55 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 14 Aug 2013 23:06:54 +0000 (19:06 -0400)
Existing --pretty, --transient, --static options, used previously
for 'set-hostname' verb, are reused for the 'status' verb. If one
of them is given, only the specified hostname is printed. This
way there's no need to employ awk to get the hostname in a script.

man/hostnamectl.xml
src/hostname/hostnamectl.c
src/test/test-libudev.c

index f28e430a421bda3b0977982e2e1e883e82c1a627..b39fb5502bdd90bcbbe73c6c73502acce1a4f251 100644 (file)
@@ -49,7 +49,9 @@
 
         <refsynopsisdiv>
                 <cmdsynopsis>
 
         <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>
 
                 </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
                 <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>
                 <filename>/etc/machine-info</filename>, see
                 <citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
         </refsect1>
                                 <term><option>--pretty</option></term>
 
                                 <listitem><para>If
                                 <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>
 
                         </varlistentry>
                 </variablelist>
 
index f7d844b9757ba5f7bd695c2e9c05805299c2474a..66015c2f4c7902e068e32b018da01fcab062b736 100644 (file)
@@ -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_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) {
 
 
 static void polkit_agent_open_if_enabled(void) {
 
@@ -152,15 +152,52 @@ static int status_property(const char *name, DBusMessageIter *iter, StatusInfo *
         return 0;
 }
 
         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 = {};
 
         _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",
         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;
 }
 
         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;
 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();
 
 
         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
                 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);
 
 
                 hostname_cleanup(h, true);
 
-                if (arg_set_static && streq(h, hostname))
+                if (arg_static && streq(h, hostname))
                         p = "";
                 else {
                         p = hostname;
                         p = "";
                 else {
                         p = hostname;
@@ -270,7 +329,7 @@ static int set_hostname(DBusConnection *bus, char **args, unsigned n) {
                 reply = NULL;
         }
 
                 reply = NULL;
         }
 
-        if (arg_set_static) {
+        if (arg_static) {
                 r = bus_method_call_with_reply(
                                 bus,
                                 "org.freedesktop.hostname1",
                 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;
         }
 
                 reply = NULL;
         }
 
-        if (arg_set_transient) {
+        if (arg_transient) {
                 r = bus_method_call_with_reply(
                                 bus,
                                 "org.freedesktop.hostname1",
                 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,
         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         },
         };
 
         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 },
                 { "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;
 
                         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;
 
                         break;
 
-                case ARG_SET_PRETTY:
-                        arg_set_pretty = true;
+                case ARG_PRETTY:
+                        arg_pretty = true;
                         break;
 
                         break;
 
-                case ARG_SET_STATIC:
-                        arg_set_static = true;
+                case ARG_STATIC:
+                        arg_static = true;
                         break;
 
                 case ARG_NO_ASK_PASSWORD:
                         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;
 }
 
         return 1;
 }
 
index caa3b4d14c14eba27f64ba68a8433f5989394767..716767ba5f5dae642e96a0bb09279e81dc145441 100644 (file)
@@ -430,7 +430,7 @@ static int test_enumerate(struct udev *udev, const char *subsystem)
 }
 
 static int test_hwdb(struct udev *udev, const char *modalias) {
 }
 
 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);
         struct udev_list_entry *entry;
 
         hwdb = udev_hwdb_new(udev);