---
 src/dbus.c | 38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/src/dbus.c b/src/dbus.c
index cadf5c6..a175178 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -24,6 +24,7 @@
 #endif
 
 #include <glib.h>
+#include <errno.h>
 #include <gdbus.h>
 
 #include "ofono.h"
@@ -45,6 +46,16 @@ static const struct error_mapping_entry cme_errors_mapping[] 
= {
        { 31,   __ofono_error_timed_out },
        { 32,   __ofono_error_access_denied },
        { 50,   __ofono_error_invalid_args },
+       { }
+};
+
+static const struct error_mapping_entry errno_errors_mapping[] = {
+       { EACCES,      __ofono_error_access_denied },
+       { EOPNOTSUPP,  __ofono_error_not_supported },
+       { ENOSYS,      __ofono_error_not_implemented },
+       { ETIMEDOUT,   __ofono_error_timed_out },
+       { EINPROGRESS, __ofono_error_busy },
+       { }
 };
 
 static void append_variant(DBusMessageIter *iter,
@@ -419,26 +430,31 @@ DBusMessage *__ofono_error_network_terminated(DBusMessage 
*msg)
                                        " network");
 }
 
-DBusMessage *__ofono_error_from_error(const struct ofono_error *error,
-                                               DBusMessage *msg)
+static DBusMessage *__ofono_map_error(const struct error_mapping_entry *map,
+                                               int error, DBusMessage *msg)
 {
        const struct error_mapping_entry *e;
-       int maxentries;
-       int i;
 
+       for (e = map; e->ofono_error_func; e++)
+               if (e->error == error)
+                       return e->ofono_error_func(msg);
+
+       return __ofono_error_failed(msg);
+}
+
+DBusMessage *__ofono_error_from_error(const struct ofono_error *error,
+                                               DBusMessage *msg)
+{
        switch (error->type) {
        case OFONO_ERROR_TYPE_CME:
-               e = cme_errors_mapping;
-               maxentries = sizeof(cme_errors_mapping) /
-                                       sizeof(struct error_mapping_entry);
-               for (i = 0; i < maxentries; i++)
-                       if (e[i].error == error->error)
-                               return e[i].ofono_error_func(msg);
-               break;
+               return __ofono_map_error(cme_errors_mapping, error->error, msg);
        case OFONO_ERROR_TYPE_CMS:
                return __ofono_error_failed(msg);
        case OFONO_ERROR_TYPE_CEER:
                return __ofono_error_failed(msg);
+       case OFONO_ERROR_TYPE_ERRNO:
+               return __ofono_map_error(errno_errors_mapping,
+                                               ABS(error->error), msg);
        default:
                return __ofono_error_failed(msg);
        }
-- 
1.9.1

_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to