diff options
author | Thomas Haller <thaller@redhat.com> | 2020-05-25 19:37:01 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-06-05 09:17:20 +0200 |
commit | 00b3a3505a6cdad7c3bb88cd3c1d447fb6963f95 (patch) | |
tree | 18ab9e7ab8ab0952ab9427b17e3f3c67db4a9810 | |
parent | 4230a1d4fb3bf3d018d93dad692ea2fb364fb4c3 (diff) | |
download | NetworkManager-00b3a3505a6cdad7c3bb88cd3c1d447fb6963f95.tar.gz |
keyfile: add nm_keyfile_handler_data_warn_get() and construct message lazy
Add an accessor for the warning event.
Also, as we now have an accessor, we can construct the warning
message only if it actually needed.
-rw-r--r-- | shared/nm-keyfile/nm-keyfile-internal.h | 10 | ||||
-rw-r--r-- | shared/nm-keyfile/nm-keyfile.c | 53 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/nms-keyfile-reader.c | 18 |
3 files changed, 68 insertions, 13 deletions
diff --git a/shared/nm-keyfile/nm-keyfile-internal.h b/shared/nm-keyfile/nm-keyfile-internal.h index 719e5501aa..be0f800a52 100644 --- a/shared/nm-keyfile/nm-keyfile-internal.h +++ b/shared/nm-keyfile/nm-keyfile-internal.h @@ -119,7 +119,9 @@ GKeyFile *nm_keyfile_write (NMConnection *connection, */ typedef struct { NMKeyfileWarnSeverity severity; - const char *message; + char *message; + const char *fmt; + va_list ap; } NMKeyfileHandlerDataWarn; /** @@ -160,6 +162,12 @@ void nm_keyfile_handler_data_get_context (const NMKeyfileHandlerData *handler_da NMSetting **out_cur_setting, const char **out_cur_property_name); +void nm_keyfile_handler_data_warn_get (const NMKeyfileHandlerData *handler_data, + const char **out_message, + NMKeyfileWarnSeverity *out_severity); + +const char *_nm_keyfile_handler_data_warn_get_message (const NMKeyfileHandlerData *handler_data); + /*****************************************************************************/ char *nm_keyfile_plugin_kf_get_string (GKeyFile *kf, const char *group, const char *key, GError **error); diff --git a/shared/nm-keyfile/nm-keyfile.c b/shared/nm-keyfile/nm-keyfile.c index b6a89a2e4e..3b198d1ae3 100644 --- a/shared/nm-keyfile/nm-keyfile.c +++ b/shared/nm-keyfile/nm-keyfile.c @@ -103,12 +103,14 @@ _key_file_handler_data_init_write (NMKeyfileHandlerData *handler_data, &info->error); } +_nm_printf (5, 6) static void _handle_warn (KeyfileReaderInfo *info, const char *kf_key, const char *cur_property, NMKeyfileWarnSeverity severity, - char *message) + const char *fmt, + ...) { NMKeyfileHandlerData handler_data; @@ -119,15 +121,21 @@ _handle_warn (KeyfileReaderInfo *info, cur_property); handler_data.warn = (NMKeyfileHandlerDataWarn) { .severity = severity, - .message = message, + .message = NULL, + .fmt = fmt, }; + va_start (handler_data.warn.ap, fmt); + info->read_handler (info->keyfile, info->connection, NM_KEYFILE_HANDLER_TYPE_WARN, &handler_data, info->user_data); - g_free (message); + + va_end (handler_data.warn.ap); + + g_free (handler_data.warn.message); } #define handle_warn(arg_info, arg_kf_key, arg_property_name, arg_severity, ...) \ @@ -141,7 +149,7 @@ _handle_warn (KeyfileReaderInfo *info, (arg_kf_key), \ (arg_property_name), \ (arg_severity), \ - g_strdup_printf (__VA_ARGS__)); \ + __VA_ARGS__); \ } \ _info->error == NULL; \ }) @@ -4393,3 +4401,40 @@ nm_keyfile_handler_data_get_context (const NMKeyfileHandlerData *handler_data, NM_SET_OUT (out_cur_setting, handler_data->cur_setting); NM_SET_OUT (out_cur_property_name, handler_data->cur_property); } + +const char * +_nm_keyfile_handler_data_warn_get_message (const NMKeyfileHandlerData *handler_data) +{ + nm_assert (handler_data); + nm_assert (handler_data->type == NM_KEYFILE_HANDLER_TYPE_WARN); + + if (!handler_data->warn.message) { + /* we cast the const away. @handler_data is const w.r.t. visible mutations + * from POV of the user. Internally, we construct the message in + * a lazy manner. It's like a mutable field in C++. */ + NM_PRAGMA_WARNING_DISABLE ("-Wformat-nonliteral") + ((NMKeyfileHandlerData *) handler_data)->warn.message = g_strdup_vprintf (handler_data->warn.fmt, + ((NMKeyfileHandlerData *) handler_data)->warn.ap); + NM_PRAGMA_WARNING_REENABLE + } + return handler_data->warn.message; +} + +/** + * nm_keyfile_handler_data_warn_get: + * @handler_data: the #NMKeyfileHandlerData for a %NM_KEYFILE_HANDLER_TYPE_WARN + * event. + * @out_message: (out) (allow-none) (transfer none): the warning message. + * @out_severity: (out) (allow-none): the #NMKeyfileWarnSeverity warning severity. + */ +void +nm_keyfile_handler_data_warn_get (const NMKeyfileHandlerData *handler_data, + const char **out_message, + NMKeyfileWarnSeverity *out_severity) +{ + g_return_if_fail (handler_data); + g_return_if_fail (handler_data->type == NM_KEYFILE_HANDLER_TYPE_WARN); + + NM_SET_OUT (out_message, _nm_keyfile_handler_data_warn_get_message (handler_data)); + NM_SET_OUT (out_severity, handler_data->warn.severity); +} diff --git a/src/settings/plugins/keyfile/nms-keyfile-reader.c b/src/settings/plugins/keyfile/nms-keyfile-reader.c index 520053c191..2459be483f 100644 --- a/src/settings/plugins/keyfile/nms-keyfile-reader.c +++ b/src/settings/plugins/keyfile/nms-keyfile-reader.c @@ -17,11 +17,15 @@ /*****************************************************************************/ static const char * -_fmt_warn (const char *group, NMSetting *setting, const char *property_name, const char *message, char **out_message) +_fmt_warn (const NMKeyfileHandlerData *handler_data, char **out_message) { - const char *setting_name = setting ? nm_setting_get_name (setting) : NULL; + const char *group = handler_data->kf_group_name; + const char *message = _nm_keyfile_handler_data_warn_get_message (handler_data); if (group) { + NMSetting *setting = handler_data->cur_setting; + const char *property_name = handler_data->cur_property; + const char *setting_name = setting ? nm_setting_get_name (setting) : NULL; char *res; if (setting_name) { @@ -37,8 +41,9 @@ _fmt_warn (const char *group, NMSetting *setting, const char *property_name, con res = g_strdup_printf ("%s: %s", group, message); *out_message = res; return res; - } else - return message; + } + + return message; } typedef struct { @@ -76,10 +81,7 @@ _handler_read (GKeyFile *keyfile, NULL, nm_connection_get_uuid (connection), "keyfile: %s", - _fmt_warn (handler_data->kf_group_name, - handler_data->cur_setting, - handler_data->cur_property, - warn_data->message, + _fmt_warn (handler_data, &message_free)); g_free (message_free); return TRUE; |