diff options
-rw-r--r-- | man/systemctl.xml | 5 | ||||
-rw-r--r-- | src/systemctl/systemctl.c | 25 |
2 files changed, 22 insertions, 8 deletions
diff --git a/man/systemctl.xml b/man/systemctl.xml index 1a55522b12..683f2e7402 100644 --- a/man/systemctl.xml +++ b/man/systemctl.xml @@ -120,10 +120,9 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. <para>When showing unit/job/manager properties, limit display to certain properties as specified as argument. If not specified all set properties are shown. The argument - should be a property name, such as + should be a comma-seperated list of property names, such as <literal>MainPID</literal>. If specified more than once all - properties with the specified names are - shown.</para> + properties with the specified names are shown.</para> </listitem> </varlistentry> diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index ddf46b66d5..509651c1fd 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -4394,18 +4394,33 @@ static int systemctl_parse_argv(int argc, char *argv[]) { log_info("Use -t help to see a list of allowed values."); return -EINVAL; case 'p': { - char **l; + char *word, *state; + size_t size; + /* Make sure that if the empty property list + was specified, we won't show any properties. */ + const char *source = isempty(optarg) ? " " : optarg; + + FOREACH_WORD_SEPARATOR(word, size, source, ",", state) { + char _cleanup_free_ *prop; + char **tmp; + + prop = strndup(word, size); + if (!prop) + return -ENOMEM; - if (!(l = strv_append(arg_property, optarg))) - return -ENOMEM; + tmp = strv_append(arg_property, prop); + if (!tmp) + return -ENOMEM; - strv_free(arg_property); - arg_property = l; + strv_free(arg_property); + arg_property = tmp; + } /* If the user asked for a particular * property, show it to him, even if it is * empty. */ arg_all = true; + break; } |