add --get-serving-system
[project/uqmi.git] / dev.c
diff --git a/dev.c b/dev.c
index ed9d60f..b00ee8d 100644 (file)
--- a/dev.c
+++ b/dev.c
@@ -4,6 +4,10 @@
 #include <stdio.h>
 #include <string.h>
 #include "uqmi.h"
+#include "qmi-errors.h"
+#include "qmi-errors.c"
+
+bool cancel_all_requests = false;
 
 #define __qmi_service(_n) [__##_n] = _n
 static const uint8_t qmi_services[__QMI_SERVICE_LAST] = {
@@ -53,10 +57,14 @@ static void __qmi_request_complete(struct qmi_dev *qmi, struct qmi_request *req,
        req->pending = false;
        list_del(&req->list);
 
-       tlv_buf = qmi_msg_get_tlv_buf(msg, &tlv_len);
-       req->ret = qmi_check_message_status(tlv_buf, tlv_len);
-       if (req->ret)
-               msg = NULL;
+       if (msg) {
+               tlv_buf = qmi_msg_get_tlv_buf(msg, &tlv_len);
+               req->ret = qmi_check_message_status(tlv_buf, tlv_len);
+               if (req->ret)
+                       msg = NULL;
+       } else {
+               req->ret = QMI_ERROR_CANCELLED;
+       }
 
        if (req->cb && (msg || !req->no_error_cb))
                req->cb(qmi, req, msg);
@@ -172,6 +180,10 @@ int qmi_request_wait(struct qmi_dev *qmi, struct qmi_request *req)
                cancelled = uloop_cancelled;
                uloop_cancelled = false;
                uloop_run();
+
+               if (cancel_all_requests)
+                       qmi_request_cancel(qmi, req);
+
                uloop_cancelled = cancelled;
        }
 
@@ -335,3 +347,15 @@ QmiService qmi_service_get_by_name(const char *str)
 
        return -1;
 }
+
+const char *qmi_get_error_str(int code)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(qmi_errors); i++) {
+               if (qmi_errors[i].code == code)
+                       return qmi_errors[i].text;
+       }
+
+       return "Unknown error";
+}