diff options
author | Thomas Haller <thaller@redhat.com> | 2020-04-02 13:59:53 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-04-04 19:28:41 +0200 |
commit | dbf697c75967406ff05e15e93eb96e7b47df2a1e (patch) | |
tree | 1c59cf96c9afa66780f8efa57073a9cd48fa7c83 | |
parent | 7627173c0e33905e0fee72542f9232ea0e6b1e9c (diff) | |
download | NetworkManager-dbf697c75967406ff05e15e93eb96e7b47df2a1e.tar.gz |
cli: avoid passing full NmCli global variable to nm_cli_spawn_pager()
We should not use global variables, and we should minimize the state
that we pass around. Instead of requiring the full NmCli struct in
nm_cli_spawn_pager(), pass only the necessary data.
This reduces our use of global variables.
-rw-r--r-- | clients/cli/connections.c | 2 | ||||
-rw-r--r-- | clients/cli/general.c | 4 | ||||
-rw-r--r-- | clients/cli/nmcli.c | 14 | ||||
-rw-r--r-- | clients/cli/nmcli.h | 10 | ||||
-rw-r--r-- | clients/cli/utils.c | 2 |
5 files changed, 20 insertions, 12 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 4537814776..e9e21be827 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -2093,7 +2093,7 @@ do_connections_show (NmCli *nmc, int argc, char **argv) } } - nm_cli_spawn_pager (nmc); + nm_cli_spawn_pager (&nmc->nmc_config, &nmc->pager_data); items = con_show_get_items (nmc, active_only, show_active_fields, order); g_ptr_array_add (items, NULL); diff --git a/clients/cli/general.c b/clients/cli/general.c index 2cc86aaaf2..6e7410ed20 100644 --- a/clients/cli/general.c +++ b/clients/cli/general.c @@ -556,7 +556,7 @@ print_permissions (void *user_data) permissions[i] = GINT_TO_POINTER (nm_auth_permission_sorted[i]); permissions[i] = NULL; - nm_cli_spawn_pager (nmc); + nm_cli_spawn_pager (&nmc->nmc_config, &nmc->pager_data); if (!nmc_print (&nmc->nmc_config, permissions, @@ -1447,7 +1447,7 @@ do_overview (NmCli *nmc, int argc, char **argv) /* Register polkit agent */ nmc_start_polkit_agent_start_try (nmc); - nm_cli_spawn_pager (nmc); + nm_cli_spawn_pager (&nmc->nmc_config, &nmc->pager_data); /* The VPN connections don't have devices (yet?). */ p = nm_client_get_active_connections (nmc->client); diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c index 6751a080c1..aedb2e0874 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -911,11 +911,12 @@ signal_handler (gpointer user_data) } void -nm_cli_spawn_pager (NmCli *nmc) +nm_cli_spawn_pager (const NmcConfig *nmc_config, + NmcPagerData *pager_data) { - if (nmc->pager_pid > 0) + if (pager_data->pid != 0) return; - nmc->pager_pid = nmc_terminal_spawn_pager (&nmc->nmc_config); + pager_data->pid = nmc_terminal_spawn_pager (nmc_config); } static void @@ -937,13 +938,14 @@ nmc_cleanup (NmCli *nmc) nm_clear_g_free (&nmc->required_fields); - if (nmc->pager_pid > 0) { + if (nmc->pager_data.pid != 0) { + pid_t pid = nm_steal_int (&nmc->pager_data.pid); + fclose (stdout); fclose (stderr); do { - ret = waitpid (nmc->pager_pid, NULL, 0); + ret = waitpid (pid, NULL, 0); } while (ret == -1 && errno == EINTR); - nmc->pager_pid = 0; } nm_clear_g_free (&nmc->palette_buffer); diff --git a/clients/cli/nmcli.h b/clients/cli/nmcli.h index f9a0661629..29d52d09a3 100644 --- a/clients/cli/nmcli.h +++ b/clients/cli/nmcli.h @@ -101,6 +101,10 @@ typedef struct _NmcConfig { const char *palette[_NM_META_COLOR_NUM]; /* Color palette */ } NmcConfig; +typedef struct { + pid_t pid; +} NmcPagerData; + typedef struct _NmcOutputData { GPtrArray *output_data; /* GPtrArray of arrays of NmcOutputField structs - accumulates data for output */ } NmcOutputData; @@ -111,7 +115,8 @@ typedef struct _NmCli { NMCResultCode return_value; /* Return code of nmcli */ GString *return_text; /* Reason text */ - pid_t pager_pid; /* PID of a pager, if one was spawned */ + + NmcPagerData pager_data; int timeout; /* Operation timeout */ @@ -150,7 +155,8 @@ void nmc_clear_sigint (void); void nmc_set_sigquit_internal (void); void nmc_exit (void); -void nm_cli_spawn_pager (NmCli *nmc); +void nm_cli_spawn_pager (const NmcConfig *nmc_config, + NmcPagerData *pager_data); void nmc_empty_output_fields (NmcOutputData *output_data); diff --git a/clients/cli/utils.c b/clients/cli/utils.c index c5a4c38ea0..e97003de8f 100644 --- a/clients/cli/utils.c +++ b/clients/cli/utils.c @@ -1587,7 +1587,7 @@ print_required_fields (const NmcConfig *nmc_config, gboolean field_names = of_flags & NMC_OF_FLAG_FIELD_NAMES; gboolean section_prefix = of_flags & NMC_OF_FLAG_SECTION_PREFIX; - nm_cli_spawn_pager (&nm_cli); + nm_cli_spawn_pager (nmc_config, &nm_cli.pager_data); /* --- Main header --- */ if ( nmc_config->print_output == NMC_PRINT_PRETTY |