This makes the code easier to read as the command line parsing
code is quite big, and now it's not mixed in the main function
anymore.

Signed-off-by: Denis 'GNUtoo' Carikli <gnu...@cyberdimension.org>
---
 tools/ipc-modem.c | 86 ++++++++++++++++++++++++++++-------------------
 1 file changed, 51 insertions(+), 35 deletions(-)

diff --git a/tools/ipc-modem.c b/tools/ipc-modem.c
index 3a43ec3..039dcca 100644
--- a/tools/ipc-modem.c
+++ b/tools/ipc-modem.c
@@ -657,9 +657,8 @@ void print_cmdline_opts(struct ipc_modem_data *data)
                ipc_modem_log(data->client, MODEM_LOG_INFO, "dry-run mode\n");
 }
 
-int main(int argc, char *argv[])
+int parse_cmdline_opts(struct ipc_modem_data *data, int argc, char *argv[])
 {
-       struct ipc_modem_data data;
        int c = 0;
        int opt_i = 0;
 
@@ -673,13 +672,12 @@ int main(int argc, char *argv[])
                {0,            0,                  0,  0 }
        };
 
-       bzero((void *)&data, sizeof(data));
-
        if (argc < 2) {
                print_help();
                exit(1);
        }
 
+       /* Handle options arguments */
        while (true) {
                c = getopt_long(argc, argv, "", opt_l, &opt_i);
                if (c != 0)
@@ -689,9 +687,9 @@ int main(int argc, char *argv[])
                        if (optarg) {
                                if (strlen(optarg) < 14) {
                                        assert(strlen(optarg) <
-                                              sizeof(data.call_number));
+                                              sizeof(data->call_number));
                                        printf("[I] Got call number!\n");
-                                       strcpy(data.call_number, optarg);
+                                       strcpy(data->call_number, optarg);
                                } else {
                                        printf("[E] "
                                               "Call number is too long!\n");
@@ -706,9 +704,9 @@ int main(int argc, char *argv[])
                                return 1;
                        }
                } else if (strcmp(opt_l[opt_i].name, "debug") == 0) {
-                       data.debug = true;
+                       data->debug = true;
                } else if (strcmp(opt_l[opt_i].name, "dry-run") == 0) {
-                       data.dry_run = true;
+                       data->dry_run = true;
                } else if (strncmp(opt_l[opt_i].name, "help", 4) == 0) {
                        print_help();
                        exit(1);
@@ -716,10 +714,10 @@ int main(int argc, char *argv[])
                           (optarg)) {
                        if (strlen(optarg) < 8) {
                                assert(strlen(optarg) <
-                                      sizeof(data.sim_pin));
+                                      sizeof(data->sim_pin));
 
                                printf("[I] Got SIM PIN!\n");
-                               strcpy(data.sim_pin, optarg);
+                               strcpy(data->sim_pin, optarg);
                        } else {
                                printf("[E] SIM PIN is too long!\n");
                                return 1;
@@ -727,40 +725,22 @@ int main(int argc, char *argv[])
                }
        }
 
-       if (data.dry_run)
-               data.client = ipc_client_create(IPC_CLIENT_TYPE_DUMMY);
-       else
-               data.client = ipc_client_create(IPC_CLIENT_TYPE_FMT);
-
-       if (data.client == 0) {
-               printf("[E] Could not create IPC client; aborting ...\n");
-               return 1;
-       }
-
-       if (data.debug == 0)
-               ipc_client_log_callback_register(data.client,
-                                                modem_log_handler_quiet,
-                                                NULL);
-       else
-               ipc_client_log_callback_register(data.client,
-                                                modem_log_handler,
-                                                NULL);
-
+       /* Handle non options arguments */
        while (optind < argc) {
                if (strncmp(argv[optind], "boot", 9) == 0) {
-                       data.command = CMD_BOOT;
+                       data->command = CMD_BOOT;
                        break;
                } else if (strncmp(argv[optind], "power-on", 8) == 0) {
-                       data.command = CMD_POWER_ON;
+                       data->command = CMD_POWER_ON;
                        break;
                } else if (strncmp(argv[optind], "power-off", 9) == 0) {
-                       data.command = CMD_POWER_OFF;
+                       data->command = CMD_POWER_OFF;
                        break;
                } else if (strncmp(argv[optind], "start", 5) == 0) {
-                       data.command = CMD_START;
+                       data->command = CMD_START;
                        break;
                } else {
-                       ipc_modem_log(data.client,
+                       ipc_modem_log(data->client,
                                      MODEM_LOG_ERROR,
                                      "Unknown argument: '%s'\n",
                                      argv[optind]);
@@ -771,7 +751,7 @@ int main(int argc, char *argv[])
                optind++;
        }
 
-       if (data.command == CMD_NONE) {
+       if (data->command == CMD_NONE) {
                printf("\n"
                       "Error: No command given. You need to use a command.\n"
                       "       See the help below for more details.\n"
@@ -780,6 +760,42 @@ int main(int argc, char *argv[])
                return 1;
        }
 
+       return 0;
+}
+
+int main(int argc, char *argv[])
+{
+       struct ipc_modem_data data;
+       int ret;
+
+       bzero((void *)&data, sizeof(data));
+
+       data.client = ipc_client_create(IPC_CLIENT_TYPE_DUMMY);
+
+       ret = parse_cmdline_opts(&data, argc, argv);
+       if (ret)
+               return ret;
+
+       if (!data.dry_run) {
+               ipc_client_destroy(data.client);
+               data.client = ipc_client_create(IPC_CLIENT_TYPE_FMT);
+
+               if (data.client == 0) {
+                       printf("[E] "
+                              "Could not create IPC client; aborting ...\n");
+                       return 1;
+               }
+       }
+
+       if (data.debug == 0)
+               ipc_client_log_callback_register(data.client,
+                                                modem_log_handler_quiet,
+                                                NULL);
+       else
+               ipc_client_log_callback_register(data.client,
+                                                modem_log_handler,
+                                                NULL);
+
        print_cmdline_opts(&data);
 
        return handle_command(&data);
-- 
2.35.1

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

Reply via email to