static int bus_append_service_property(sd_bus_message *m, const char *field, const char *eq) {
        int r;

        if (STR_IN_SET(field,
                       "PIDFile", "Type", "Restart", "BusName", "NotifyAccess",
                       "USBFunctionDescriptors", "USBFunctionStrings"))

                return bus_append_string(m, field, eq);

        if (STR_IN_SET(field, "PermissionsStartOnly", "RootDirectoryStartOnly", "RemainAfterExit", "GuessMainPID"))

                return bus_append_parse_boolean(m, field, eq);

        if (STR_IN_SET(field, "RestartSec", "TimeoutStartSec", "TimeoutStopSec", "RuntimeMaxSec", "WatchdogSec"))

                return bus_append_parse_sec_rename(m, field, eq);

        if (streq(field, "TimeoutSec")) {

                r = bus_append_parse_sec_rename(m, "TimeoutStartSec", eq);
                if (r < 0)
                        return r;

                return bus_append_parse_sec_rename(m, "TimeoutStopSec", eq);
        }

        if (streq(field, "FileDescriptorStoreMax"))

                return bus_append_safe_atou(m, field, eq);

        if (STR_IN_SET(field,
                       "ExecStartPre", "ExecStart", "ExecStartPost",
                       "ExecReload", "ExecStop", "ExecStopPost"))

                return bus_append_exec_command(m, field, eq);

        if (STR_IN_SET(field, "RestartPreventExitStatus", "RestartForceExitStatus", "SuccessExitStatus")) {
                _cleanup_free_ int *status = NULL, *signal = NULL;
                size_t sz_status = 0, sz_signal = 0;
                const char *p;

                for (p = eq;;) {
                        _cleanup_free_ char *word = NULL;
                        int val;

                        r = extract_first_word(&p, &word, NULL, EXTRACT_QUOTES);
                        if (r == 0)
                                break;
                        if (r == -ENOMEM)
                                return log_oom();
                        if (r < 0)
                                return log_error_errno(r, "Invalid syntax in %s: %s", field, eq);

                        r = safe_atoi(word, &val);
                        if (r < 0) {
                                val = signal_from_string(word);
                                if (val < 0)
                                        return log_error_errno(r, "Invalid status or signal %s in %s: %m", word, field);

                                signal = reallocarray(signal, sz_signal + 1, sizeof(int));
                                if (!signal)
                                        return log_oom();

                                signal[sz_signal++] = val;
                        } else {
                                status = reallocarray(status, sz_status + 1, sizeof(int));
                                if (!status)
                                        return log_oom();

                                status[sz_status++] = val;
                        }
                }

                r = sd_bus_message_open_container(m, SD_BUS_TYPE_STRUCT, "sv");
                if (r < 0)
                        return bus_log_create_error(r);

                r = sd_bus_message_append_basic(m, SD_BUS_TYPE_STRING, field);
                if (r < 0)
                        return bus_log_create_error(r);

                r = sd_bus_message_open_container(m, 'v', "(aiai)");
                if (r < 0)
                        return bus_log_create_error(r);

                r = sd_bus_message_open_container(m, 'r', "aiai");
                if (r < 0)
                        return bus_log_create_error(r);

                r = sd_bus_message_append_array(m, 'i', status, sz_status);
                if (r < 0)
                        return bus_log_create_error(r);

                r = sd_bus_message_append_array(m, 'i', signal, sz_signal);
                if (r < 0)
                        return bus_log_create_error(r);

                r = sd_bus_message_close_container(m);
                if (r < 0)
                        return bus_log_create_error(r);

                r = sd_bus_message_close_container(m);
                if (r < 0)
                        return bus_log_create_error(r);

                r = sd_bus_message_close_container(m);
                if (r < 0)
                        return bus_log_create_error(r);

                return 1;
        }

        return 0;
}