/* This log level disables logging completely. It can only be passed to log_set_max_level() and cannot be
* used as a regular log level. */
#define LOG_NULL (LOG_EMERG - 1)
+assert_cc(LOG_NULL == -1);
#define SYNTHETIC_ERRNO(num) (abs(num) | (1 << 30))
#define IS_SYNTHETIC_ERRNO(val) (((val) >> 30) == 1)
int json_dispatch_log_level(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) {
int *log_level = ASSERT_PTR(userdata), r, t;
+ /* If SD_JSON_STRICT is set, we'll refuse attempts to set the log level to null. If SD_JSON_RELAX is
+ * set we'll turn null (and any negative log level) into LOG_NULL (which when used as max log level
+ * means: no logging). Otherwise we turn null into LOG_INFO (which is typically our default). */
+
if (sd_json_variant_is_null(variant)) {
- *log_level = -1;
+ if (FLAGS_SET(flags, SD_JSON_STRICT))
+ return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' may not be null.", strna(name));
+
+ *log_level = FLAGS_SET(flags, SD_JSON_RELAX) ? LOG_NULL : LOG_INFO;
return 0;
}
if (r < 0)
return r;
- /* If SD_JSON_RELAX is set allow a zero interface index, otherwise refuse. */
- if (LOG_PRI(t) != t)
+ if (FLAGS_SET(flags, SD_JSON_RELAX) && t < 0)
+ t = LOG_NULL;
+ else if (LOG_PRI(t) != t)
return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a valid log level.", strna(name));
*log_level = t;
static SD_VARLINK_DEFINE_METHOD(
SetLogLevel,
- SD_VARLINK_FIELD_COMMENT("The maximum log level."),
- SD_VARLINK_DEFINE_INPUT(level, SD_VARLINK_INT, 0));
+ SD_VARLINK_FIELD_COMMENT("The maximum log level, using BSD syslog log level integers."),
+ SD_VARLINK_DEFINE_INPUT(level, SD_VARLINK_INT, SD_VARLINK_NULLABLE));
SD_VARLINK_DEFINE_INTERFACE(
io_systemd_service,