+ case ARG_CAPABILITY: {
+ char *state, *word;
+ size_t length;
+
+ FOREACH_WORD_SEPARATOR(word, length, optarg, ",", state) {
+ cap_value_t cap;
+ char *t;
+
+ t = strndup(word, length);
+ if (!t)
+ return log_oom();
+
+ if (cap_from_name(t, &cap) < 0) {
+ log_error("Failed to parse capability %s.", t);
+ free(t);
+ return -EINVAL;
+ }
+
+ free(t);
+ arg_retain |= 1ULL << (uint64_t) cap;
+ }
+
+ break;
+ }
+
+ case 'j':
+ arg_link_journal = LINK_GUEST;
+ break;
+
+ case ARG_LINK_JOURNAL:
+ if (streq(optarg, "auto"))
+ arg_link_journal = LINK_AUTO;
+ else if (streq(optarg, "no"))
+ arg_link_journal = LINK_NO;
+ else if (streq(optarg, "guest"))
+ arg_link_journal = LINK_GUEST;
+ else if (streq(optarg, "host"))
+ arg_link_journal = LINK_HOST;
+ else {
+ log_error("Failed to parse link journal mode %s", optarg);
+ return -EINVAL;
+ }
+
+ break;
+
+ case ARG_BIND:
+ case ARG_BIND_RO: {
+ _cleanup_free_ char *a = NULL, *b = NULL;
+ char *e;
+ char ***x;
+ int r;
+
+ x = c == ARG_BIND ? &arg_bind : &arg_bind_ro;
+
+ e = strchr(optarg, ':');
+ if (e) {
+ a = strndup(optarg, e - optarg);
+ b = strdup(e + 1);
+ } else {
+ a = strdup(optarg);
+ b = strdup(optarg);
+ }
+
+ if (!a || !b)
+ return log_oom();
+
+ if (!path_is_absolute(a) || !path_is_absolute(b)) {
+ log_error("Invalid bind mount specification: %s", optarg);
+ return -EINVAL;
+ }
+
+ r = strv_extend(x, a);
+ if (r < 0)
+ return r;
+
+ r = strv_extend(x, b);
+ if (r < 0)
+ return r;
+
+ break;
+ }
+