keyfile: rework error reporting from read/write handler

Setting the error on the callback does not work well from bindings.
Instead, let bindings call a (future) nm_keyfile_handler_data_fail_with_error()
function on the handler_data to indicate failure.
This commit is contained in:
Thomas Haller 2020-05-24 22:39:39 +02:00
parent e3d7ba89e5
commit ab7d0c62f9
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
4 changed files with 36 additions and 25 deletions

View file

@ -52,8 +52,7 @@ typedef gboolean (*NMKeyfileReadHandler) (GKeyFile *keyfile,
NMConnection *connection,
NMKeyfileHandlerType handler_type,
NMKeyfileHandlerData *handler_data,
void *user_data,
GError **error);
void *user_data);
typedef enum {
NM_KEYFILE_WARN_SEVERITY_DEBUG = 1000,
@ -103,8 +102,7 @@ typedef gboolean (*NMKeyfileWriteHandler) (NMConnection *connection,
GKeyFile *keyfile,
NMKeyfileHandlerType handler_type,
NMKeyfileHandlerData *handler_data,
void *user_data,
GError **error);
void *user_data);
GKeyFile *nm_keyfile_write (NMConnection *connection,
NMKeyfileWriteHandler handler,
@ -146,6 +144,7 @@ typedef struct {
struct _NMKeyfileHandlerData {
NMKeyfileHandlerType type;
GError **p_error;
union {
NMKeyfileHandlerDataWarn warn;
NMKeyfileHandlerDataWriteCert write_cert;

View file

@ -49,16 +49,30 @@ typedef struct {
/*****************************************************************************/
static void
_key_file_handler_data_init (NMKeyfileHandlerData *handler_data,
NMKeyfileHandlerType handler_type,
GError **p_error)
{
nm_assert (handler_data);
nm_assert (p_error && !*p_error);
handler_data->type = handler_type;
handler_data->p_error = p_error;
}
static void
_handle_warn (KeyfileReaderInfo *info,
const char *property_name,
NMKeyfileWarnSeverity severity,
char *message)
{
NMKeyfileHandlerData type_data;
NMKeyfileHandlerData handler_data;
type_data.type = NM_KEYFILE_HANDLER_TYPE_WARN;
type_data.warn = (NMKeyfileHandlerDataWarn) {
_key_file_handler_data_init (&handler_data,
NM_KEYFILE_HANDLER_TYPE_WARN,
&info->error);
handler_data.warn = (NMKeyfileHandlerDataWarn) {
.group = info->group,
.setting = info->setting,
.property_name = property_name,
@ -69,9 +83,8 @@ _handle_warn (KeyfileReaderInfo *info,
info->read_handler (info->keyfile,
info->connection,
NM_KEYFILE_HANDLER_TYPE_WARN,
&type_data,
info->user_data,
&info->error);
&handler_data,
info->user_data);
g_free (message);
}
#define handle_warn(arg_info, arg_property_name, arg_severity, ...) \
@ -2420,7 +2433,7 @@ cert_writer (KeyfileWriterInfo *info,
const GValue *value)
{
const NMSetting8021xSchemeVtable *vtable = NULL;
NMKeyfileHandlerData type_data;
NMKeyfileHandlerData handler_data;
guint i;
for (i = 0; nm_setting_8021x_scheme_vtable[i].setting_key; i++) {
@ -2432,19 +2445,20 @@ cert_writer (KeyfileWriterInfo *info,
if (!vtable)
g_return_if_reached ();
type_data.type = NM_KEYFILE_HANDLER_TYPE_WRITE_CERT;
type_data.write_cert = (NMKeyfileHandlerDataWriteCert) {
.setting = NM_SETTING_802_1X (setting),
.vtable = vtable,
};
if (info->write_handler) {
_key_file_handler_data_init (&handler_data,
NM_KEYFILE_HANDLER_TYPE_WRITE_CERT,
&info->error);
handler_data.write_cert = (NMKeyfileHandlerDataWriteCert) {
.setting = NM_SETTING_802_1X (setting),
.vtable = vtable,
};
if (info->write_handler (info->connection,
info->keyfile,
NM_KEYFILE_HANDLER_TYPE_WRITE_CERT,
&type_data,
info->user_data,
&info->error))
&handler_data,
info->user_data))
return;
if (info->error)
return;

View file

@ -50,8 +50,7 @@ _handler_read (GKeyFile *keyfile,
NMConnection *connection,
NMKeyfileHandlerType type,
NMKeyfileHandlerData *type_data,
void *user_data,
GError **error)
void *user_data)
{
const HandlerReadData *handler_data = user_data;

View file

@ -148,14 +148,13 @@ _handler_write (NMConnection *connection,
GKeyFile *keyfile,
NMKeyfileHandlerType type,
NMKeyfileHandlerData *type_data,
void *user_data,
GError **error)
void *user_data)
{
if (type == NM_KEYFILE_HANDLER_TYPE_WRITE_CERT) {
cert_writer (connection, keyfile,
&type_data->write_cert,
user_data,
error);
type_data->p_error);
return TRUE;
}
return FALSE;