---
 tools/ipc-modem.c | 125 ++++++++++++++++++++++++++++++++++++----------
 1 file changed, 100 insertions(+), 25 deletions(-)

diff --git a/tools/ipc-modem.c b/tools/ipc-modem.c
index 9314de6..9e3064c 100644
--- a/tools/ipc-modem.c
+++ b/tools/ipc-modem.c
@@ -377,35 +377,67 @@ void modem_response_handle(struct ipc_client *client, 
struct ipc_message *resp)
 }
 
 
-int modem_read_loop(struct ipc_client *client)
+int modem_poll_client(struct ipc_client *client, char const *variation)
 {
        struct ipc_message resp;
-       int rc;
+        int rc;
+        struct timeval timeout;
 
        memset(&resp, 0, sizeof(resp));
 
+        timeout.tv_sec = 0;
+        timeout.tv_usec = 50000;
+        rc = ipc_client_poll(client, NULL, &timeout);
+        if (rc < 0) {
+                printf("[E] poll of %s client failed\n", variation);
+                return -1;
+        }
+
+        if (rc == 0) {
+                /* timeout. */
+                return 0;
+        }
+
+        rc = ipc_client_recv(client, &resp);
+        if (rc < 0) {
+                printf("[E] "
+                       "Can't RECV from modem %s: please run this again"
+                       "\n", variation);
+                return -1;
+        }
+
+        modem_response_handle(client, &resp);
+
+        if (resp.data != NULL)
+                free(resp.data);
+
+       return 1;
+}
+
+void modem_read_loop(struct ipc_client *client_fmt, struct ipc_client 
*client_rfs)
+{
        while (1) {
                usleep(3000);
 
-               rc = ipc_client_poll(client, NULL, NULL);
-               if (rc < 0)
-                       continue;
-
-               rc = ipc_client_recv(client, &resp);
-               if (rc < 0) {
-                       printf("[E] "
-                              "Can't RECV from modem: please run this again"
-                              "\n");
-                       break;
-               }
-
-               modem_response_handle(client, &resp);
-
-               if (resp.data != NULL)
-                       free(resp.data);
+                switch (modem_poll_client(client_fmt, "FMT")) {
+                case -1:
+                        return;
+                case 0:
+                        if (client_rfs != NULL) {
+                                switch (modem_poll_client(client_rfs, "RFS")) {
+                                case -1:
+                                        return;
+                                case 0:
+                                        break;
+                                default:
+                                        break;
+                                }
+                        }
+                        break;
+                default:
+                        break;
+                }
        }
-
-       return 0;
 }
 
 void modem_log_handler(__attribute__((unused)) void *user_data,
@@ -476,20 +508,24 @@ void print_help(void)
        printf("\tpower-off             power off the modem\n");
        printf("arguments:\n");
        printf("\t--debug               enable debug messages\n");
+       printf("\t--rfs                 enable RFS client in addition to FMT 
client\n");
        printf("\t--pin=[PIN]           provide SIM card PIN\n");
 }
 
 int main(int argc, char *argv[])
 {
-       struct ipc_client *client_fmt;
+       struct ipc_client *client_fmt = 0;
+        struct ipc_client *client_rfs = 0;
        int c = 0;
        int opt_i = 0;
        int rc = -1;
        int debug = 0;
+        int rfs = 0;
 
        struct option opt_l[] = {
                {"help",    no_argument,        0,  0 },
                {"debug",   no_argument,        0,  0 },
+               {"rfs",     no_argument,        0,  0 },
                {"pin",     required_argument,  0,  0 },
                {0,         0,                  0,  0 }
        };
@@ -512,6 +548,9 @@ int main(int argc, char *argv[])
                        } else if (strcmp(opt_l[opt_i].name, "debug") == 0) {
                                debug = 1;
                                printf("[I] Debug enabled\n");
+                       } else if (strcmp(opt_l[opt_i].name, "rfs") == 0) {
+                               rfs = 1;
+                               printf("[I] RFS enabled\n");
                        } else if (strcmp(opt_l[opt_i].name, "pin") == 0) {
                                if (optarg) {
                                        if (strlen(optarg) < 8) {
@@ -536,12 +575,30 @@ int main(int argc, char *argv[])
                goto modem_quit;
        }
 
+        if (rfs) {
+                client_rfs = ipc_client_create(IPC_CLIENT_TYPE_RFS);
+                if (client_rfs == 0) {
+                        printf("[E] Could not create RFS client; aborting 
...\n");
+                        goto modem_quit;
+                }
+        } else {
+                client_rfs = 0;
+        }
+
        if (debug == 0) {
                ipc_client_log_callback_register(client_fmt,
                                                 modem_log_handler_quiet, NULL);
+                if (rfs) {
+                        ipc_client_log_callback_register(client_rfs,
+                                                         
modem_log_handler_quiet, NULL);
+                }
        } else {
                ipc_client_log_callback_register(client_fmt, modem_log_handler,
                                                 NULL);
+                if (rfs) {
+                        ipc_client_log_callback_register(client_rfs, 
modem_log_handler,
+                                                         NULL);
+                }
        }
 
        while (optind < argc) {
@@ -561,18 +618,34 @@ int main(int argc, char *argv[])
                                printf("[E] Something went wrong "
                                       "while bootstrapping modem\n");
                } else if (strncmp(argv[optind], "start", 5) == 0) {
-                       printf("[0] Starting modem on FMT client\n");
+                       printf("[0] Starting modem FMT client\n");
                        rc = modem_start(client_fmt);
                        if (rc < 0) {
-                               printf("[E] Something went wrong\n");
+                               printf("[E] Something went wrong starting FMT 
client\n");
                                modem_stop(client_fmt);
                                return 1;
                        }
 
-                       printf("[1] Starting modem_read_loop on FMT client\n");
-                       modem_read_loop(client_fmt);
+                        if (rfs) {
+                                printf("[1] Starting modem RFS client\n");
+                                ipc_client_data_create(client_rfs);
+                                rc = ipc_client_open(client_rfs);
+                                if (rc < 0) {
+                                        printf("[E] Something went wrong 
starting RFS client\n");
+                                        ipc_client_close(client_rfs);
+                                        modem_stop(client_fmt);
+                                        return 1;
+                                }
+                        } else {
+                                printf("[1] Skipping modem RFS client 
start\n");
+                        }
+
+                       printf("[2] Starting modem_read_loop on FMT client\n");
+                       modem_read_loop(client_fmt, client_rfs);
 
                        modem_stop(client_fmt);
+                        if (client_rfs != 0)
+                                ipc_client_close(client_rfs);
                } else {
                        printf("[E] Unknown argument: '%s'\n", argv[optind]);
                        print_help();
@@ -585,6 +658,8 @@ int main(int argc, char *argv[])
 modem_quit:
        if (client_fmt != 0)
                ipc_client_destroy(client_fmt);
+       if (client_rfs != 0)
+               ipc_client_destroy(client_rfs);
 
        return 0;
 }
-- 
2.28.0

_______________________________________________
Replicant mailing list
Replicant@osuosl.org
https://lists.osuosl.org/mailman/listinfo/replicant

Reply via email to