diff options
| author | Sebastien Bacher <seb128@ubuntu.com> | 2019-03-12 15:16:42 +0100 |
|---|---|---|
| committer | Sebastien Bacher <seb128@ubuntu.com> | 2019-03-12 15:16:42 +0100 |
| commit | cc4ab276f923ded9f415c1c2bf192994367ab0bb (patch) | |
| tree | ac3a7775665992b27d07eb44186d38ff961a8cd7 /clients/cli | |
| parent | bb1cf58350bb34463e9ffc5f96ac4f9b6bf46d28 (diff) | |
| parent | dd428301eb6f02542015121d7b08d9997f137e50 (diff) | |
Update upstream source from tag 'upstream/1.15.91'
Update to upstream version '1.15.91' with Debian dir 74de38245314cab529c6c94cd9d0b874ce0c2994
Diffstat (limited to 'clients/cli')
| -rw-r--r-- | clients/cli/agent.c | 8 | ||||
| -rw-r--r-- | clients/cli/common.c | 54 | ||||
| -rw-r--r-- | clients/cli/common.h | 4 | ||||
| -rw-r--r-- | clients/cli/connections.c | 56 | ||||
| -rw-r--r-- | clients/cli/devices.c | 64 | ||||
| -rw-r--r-- | clients/cli/general.c | 3 | ||||
| -rw-r--r-- | clients/cli/nmcli.c | 17 | ||||
| -rw-r--r-- | clients/cli/nmcli.h | 4 | ||||
| -rw-r--r-- | clients/cli/polkit-agent.c | 1 | ||||
| -rw-r--r-- | clients/cli/utils.c | 34 |
10 files changed, 142 insertions, 103 deletions
diff --git a/clients/cli/agent.c b/clients/cli/agent.c index 05cc5dca..6c116153 100644 --- a/clients/cli/agent.c +++ b/clients/cli/agent.c @@ -25,7 +25,6 @@ #include <stdio.h> #include <stdlib.h> -#include <errno.h> #include <readline/readline.h> #include <readline/history.h> @@ -105,7 +104,10 @@ get_secrets_from_user (const NmcConfig *nmc_config, rl_startup_hook = set_deftext; pre_input_deftext = g_strdup (secret->value); } - pwd = nmc_readline (nmc_config, "%s (%s): ", secret->pretty_name, secret->entry_id); + if (secret->no_prompt_entry_id) + pwd = nmc_readline (nmc_config, "%s: ", secret->pretty_name); + else + pwd = nmc_readline (nmc_config, "%s (%s): ", secret->pretty_name, secret->entry_id); /* No password provided, cancel the secrets. */ if (!pwd) @@ -149,7 +151,7 @@ do_agent_secret (NmCli *nmc, int argc, char **argv) /* We keep running */ nmc->should_wait++; - nm_secret_agent_simple_enable (NM_SECRET_AGENT_SIMPLE (nmc->secret_agent), NULL); + nm_secret_agent_simple_enable (nmc->secret_agent, NULL); g_signal_connect (nmc->secret_agent, NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS, G_CALLBACK (secrets_requested), diff --git a/clients/cli/common.c b/clients/cli/common.c index 85b5005e..3c1c315d 100644 --- a/clients/cli/common.c +++ b/clients/cli/common.c @@ -25,7 +25,6 @@ #include <stdio.h> #include <stdlib.h> -#include <errno.h> #include <sys/ioctl.h> #include <readline/readline.h> #include <readline/history.h> @@ -686,6 +685,8 @@ get_secrets_from_user (const NmcConfig *nmc_config, pwd = g_strdup (pwd); } else { if (ask) { + gboolean echo_on; + if (secret->value) { if (!g_strcmp0 (secret->vpn_type, NM_DBUS_INTERFACE ".openconnect")) { /* Do not present and ask user for openconnect secrets, we already have them */ @@ -698,11 +699,16 @@ get_secrets_from_user (const NmcConfig *nmc_config, } if (msg) g_print ("%s\n", msg); - pwd = nmc_readline_echo (nmc_config, - secret->is_secret - ? nmc_config->show_secrets - : TRUE, - "%s (%s): ", secret->pretty_name, secret->entry_id); + + echo_on = secret->is_secret + ? nmc_config->show_secrets + : TRUE; + + if (secret->no_prompt_entry_id) + pwd = nmc_readline_echo (nmc_config, echo_on, "%s: ", secret->pretty_name); + else + pwd = nmc_readline_echo (nmc_config, echo_on, "%s (%s): ", secret->pretty_name, secret->entry_id); + if (!pwd) pwd = g_strdup (""); } else { @@ -778,7 +784,7 @@ nmc_secrets_requested (NMSecretAgentSimple *agent, /* Unregister our secret agent on failure, so that another agent * may be tried */ if (nmc->secret_agent) { - nm_secret_agent_old_unregister (nmc->secret_agent, NULL, NULL); + nm_secret_agent_old_unregister (NM_SECRET_AGENT_OLD (nmc->secret_agent), NULL, NULL); g_clear_object (&nmc->secret_agent); } } @@ -1343,23 +1349,39 @@ nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char /** * nmc_complete_strings: * @prefix: a string to match - * @...: a %NULL-terminated list of candidate strings + * @nargs: the number of elements in @args. Or -1 if @args is a NULL terminated + * strv array. + * @args: the argument list. If @nargs is not -1, then some elements may + * be %NULL to indicate to silently skip the values. * * Prints all the matching candidates for completion. Useful when there's * no better way to suggest completion other than a hardcoded string list. */ void -nmc_complete_strings (const char *prefix, ...) +nmc_complete_strv (const char *prefix, gssize nargs, const char *const*args) { - va_list args; - const char *candidate; + gsize i, n; + + if (prefix && !prefix[0]) + prefix = NULL; - va_start (args, prefix); - while ((candidate = va_arg (args, const char *))) { - if (!*prefix || matches (prefix, candidate)) - g_print ("%s\n", candidate); + if (nargs < 0) { + nm_assert (nargs == -1); + n = NM_PTRARRAY_LEN (args); + } else + n = (gsize) nargs; + + for (i = 0; i < n; i++) { + const char *candidate = args[i]; + + if (!candidate) + continue; + if ( prefix + && !matches (prefix, candidate)) + continue; + + g_print ("%s\n", candidate); } - va_end (args); } /** diff --git a/clients/cli/common.h b/clients/cli/common.h index 71734acc..688f2819 100644 --- a/clients/cli/common.h +++ b/clients/cli/common.h @@ -88,7 +88,9 @@ typedef struct { void nmc_do_cmd (NmCli *nmc, const NMCCommand cmds[], const char *cmd, int argc, char **argv); -void nmc_complete_strings (const char *prefix, ...) G_GNUC_NULL_TERMINATED; +void nmc_complete_strv (const char *prefix, gssize nargs, const char *const*args); + +#define nmc_complete_strings(prefix, ...) nmc_complete_strv ((prefix), NM_NARG (__VA_ARGS__), (const char *const[]) { __VA_ARGS__ }) void nmc_complete_bool (const char *prefix); diff --git a/clients/cli/connections.c b/clients/cli/connections.c index 446424ba..6db44f87 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -22,10 +22,8 @@ #include "connections.h" #include <stdio.h> -#include <string.h> #include <stdlib.h> #include <unistd.h> -#include <errno.h> #include <signal.h> #include <netinet/ether.h> #include <readline/readline.h> @@ -796,6 +794,7 @@ const NmcMetaGenericInfo *const metagen_con_active_vpn[_NMC_GENERIC_INFO_TYPE_CO NM_SETTING_IP4_CONFIG_SETTING_NAME","\ NM_SETTING_IP6_CONFIG_SETTING_NAME","\ NM_SETTING_SERIAL_SETTING_NAME","\ + NM_SETTING_WIFI_P2P_SETTING_NAME","\ NM_SETTING_PPP_SETTING_NAME","\ NM_SETTING_PPPOE_SETTING_NAME","\ NM_SETTING_ADSL_SETTING_NAME","\ @@ -823,6 +822,7 @@ const NmcMetaGenericInfo *const metagen_con_active_vpn[_NMC_GENERIC_INFO_TYPE_CO NM_SETTING_VXLAN_SETTING_NAME"," \ NM_SETTING_WPAN_SETTING_NAME","\ NM_SETTING_6LOWPAN_SETTING_NAME","\ + NM_SETTING_WIREGUARD_SETTING_NAME","\ NM_SETTING_PROXY_SETTING_NAME"," \ NM_SETTING_TC_CONFIG_SETTING_NAME"," \ NM_SETTING_SRIOV_SETTING_NAME"," \ @@ -2473,7 +2473,7 @@ check_activated (ActivateConnectionInfo *info) if (nmc->secret_agent) { NMRemoteConnection *connection = nm_active_connection_get_connection (info->active); - nm_secret_agent_simple_enable (NM_SECRET_AGENT_SIMPLE (nmc->secret_agent), + nm_secret_agent_simple_enable (nmc->secret_agent, nm_connection_get_path (NM_CONNECTION (connection))); } break; @@ -2775,7 +2775,6 @@ nmc_activate_connection (NmCli *nmc, g_hash_table_destroy (nmc->pwds_hash); nmc->pwds_hash = pwds_hash; - /* Create secret agent */ nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-connect"); if (nmc->secret_agent) { g_signal_connect (nmc->secret_agent, @@ -3306,7 +3305,7 @@ get_valid_properties_string (const NMMetaSettingValidPartItem *const*array, str = g_string_sized_new (1024); for (i = 0; i < 2; i++, iter = array_slv) { - for(; !full_match && iter && *iter; iter++) { + for (; !full_match && iter && *iter; iter++) { const NMMetaSettingInfoEditor *setting_info = (*iter)->setting_info; if ( !(g_str_has_prefix (setting_info->general->setting_name, prefix)) @@ -6727,7 +6726,7 @@ progress_activation_editor_cb (gpointer user_data) NMRemoteConnection *connection; connection = nm_active_connection_get_connection (ac); - nm_secret_agent_simple_enable (NM_SECRET_AGENT_SIMPLE (info->nmc->secret_agent), + nm_secret_agent_simple_enable (info->nmc->secret_agent, nm_object_get_path (NM_OBJECT (connection))); } @@ -8889,8 +8888,11 @@ do_connection_import (NmCli *nmc, int argc, char **argv) } while (argc > 0) { - if (argc == 1 && nmc->complete) - nmc_complete_strings (*argv, "type", "file", NULL); + if (argc == 1 && nmc->complete) { + nmc_complete_strings (*argv, + type ? NULL : "type", + filename ? NULL : "file"); + } if (strcmp (*argv, "type") == 0) { argc--; @@ -8900,8 +8902,13 @@ do_connection_import (NmCli *nmc, int argc, char **argv) NMC_RETURN (nmc, NMC_RESULT_ERROR_USER_INPUT); } - if (argc == 1 && nmc->complete) - complete_option ((const NMMetaAbstractInfo *) nm_meta_property_info_vpn_service_type, *argv, NULL); + if ( argc == 1 + && nmc->complete) { + nmc_complete_strings (*argv, "wireguard"); + complete_option ((const NMMetaAbstractInfo *) nm_meta_property_info_vpn_service_type, + *argv, + NULL); + } if (!type) type = *argv; @@ -8941,21 +8948,26 @@ do_connection_import (NmCli *nmc, int argc, char **argv) NMC_RETURN (nmc, NMC_RESULT_ERROR_USER_INPUT); } - service_type = nm_vpn_plugin_info_list_find_service_type (nm_vpn_get_plugin_infos (), type); - if (!service_type) { - g_string_printf (nmc->return_text, _("Error: failed to find VPN plugin for %s."), type); - NMC_RETURN (nmc, NMC_RESULT_ERROR_UNKNOWN); - } + if (nm_streq (type, "wireguard")) + connection = nm_vpn_wireguard_import (filename, &error); + else { + service_type = nm_vpn_plugin_info_list_find_service_type (nm_vpn_get_plugin_infos (), type); + if (!service_type) { + g_string_printf (nmc->return_text, _("Error: failed to find VPN plugin for %s."), type); + NMC_RETURN (nmc, NMC_RESULT_ERROR_UNKNOWN); + } - /* Import VPN configuration */ - plugin = nm_vpn_get_editor_plugin (service_type, &error); - if (!plugin) { - g_string_printf (nmc->return_text, _("Error: failed to load VPN plugin: %s."), - error->message); - NMC_RETURN (nmc, NMC_RESULT_ERROR_UNKNOWN); + /* Import VPN configuration */ + plugin = nm_vpn_get_editor_plugin (service_type, &error); + if (!plugin) { + g_string_printf (nmc->return_text, _("Error: failed to load VPN plugin: %s."), + error->message); + NMC_RETURN (nmc, NMC_RESULT_ERROR_UNKNOWN); + } + + connection = nm_vpn_editor_plugin_import (plugin, filename, &error); } - connection = nm_vpn_editor_plugin_import (plugin, filename, &error); if (!connection) { g_string_printf (nmc->return_text, _("Error: failed to import '%s': %s."), filename, error->message); diff --git a/clients/cli/devices.c b/clients/cli/devices.c index 44573fb6..04a8c988 100644 --- a/clients/cli/devices.c +++ b/clients/cli/devices.c @@ -22,9 +22,7 @@ #include "devices.h" #include <stdio.h> -#include <string.h> #include <stdlib.h> -#include <errno.h> #include <readline/readline.h> #include "nm-secret-agent-simple.h" @@ -44,43 +42,39 @@ static char * ap_wpa_rsn_flags_to_string (NM80211ApSecurityFlags flags) { - char *flags_str[16]; /* Enough space for flags and terminating NULL */ - char *ret_str; + char *flags_str[13]; int i = 0; if (flags & NM_802_11_AP_SEC_PAIR_WEP40) - flags_str[i++] = g_strdup ("pair_wpe40"); + flags_str[i++] = "pair_wpe40"; if (flags & NM_802_11_AP_SEC_PAIR_WEP104) - flags_str[i++] = g_strdup ("pair_wpe104"); + flags_str[i++] = "pair_wpe104"; if (flags & NM_802_11_AP_SEC_PAIR_TKIP) - flags_str[i++] = g_strdup ("pair_tkip"); + flags_str[i++] = "pair_tkip"; if (flags & NM_802_11_AP_SEC_PAIR_CCMP) - flags_str[i++] = g_strdup ("pair_ccmp"); + flags_str[i++] = "pair_ccmp"; if (flags & NM_802_11_AP_SEC_GROUP_WEP40) - flags_str[i++] = g_strdup ("group_wpe40"); + flags_str[i++] = "group_wpe40"; if (flags & NM_802_11_AP_SEC_GROUP_WEP104) - flags_str[i++] = g_strdup ("group_wpe104"); + flags_str[i++] = "group_wpe104"; if (flags & NM_802_11_AP_SEC_GROUP_TKIP) - flags_str[i++] = g_strdup ("group_tkip"); + flags_str[i++] = "group_tkip"; if (flags & NM_802_11_AP_SEC_GROUP_CCMP) - flags_str[i++] = g_strdup ("group_ccmp"); + flags_str[i++] = "group_ccmp"; if (flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) - flags_str[i++] = g_strdup ("psk"); + flags_str[i++] = "psk"; if (flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) - flags_str[i++] = g_strdup ("802.1X"); + flags_str[i++] = "802.1X"; + if (flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) + flags_str[i++] = "sae"; + /* Make sure you grow flags_str when adding items here. */ if (i == 0) - flags_str[i++] = g_strdup (_("(none)")); + flags_str[i++] = _("(none)"); flags_str[i] = NULL; - ret_str = g_strjoinv (" ", flags_str); - - i = 0; - while (flags_str[i]) - g_free (flags_str[i++]); - - return ret_str; + return g_strjoinv (" ", flags_str); } static NMMetaColor @@ -1164,21 +1158,21 @@ fill_output_access_point (gpointer data, gpointer user_data) if ( (flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpa_flags == NM_802_11_AP_SEC_NONE) && (rsn_flags == NM_802_11_AP_SEC_NONE)) { - g_string_append (security_str, _("WEP")); - g_string_append_c (security_str, ' '); + g_string_append (security_str, "WEP "); } if (wpa_flags != NM_802_11_AP_SEC_NONE) { - g_string_append (security_str, _("WPA1")); - g_string_append_c (security_str, ' '); + g_string_append (security_str, "WPA1 "); + } + if ( (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) + || (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { + g_string_append (security_str, "WPA2 "); } - if (rsn_flags != NM_802_11_AP_SEC_NONE) { - g_string_append (security_str, _("WPA2")); - g_string_append_c (security_str, ' '); + if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) { + g_string_append (security_str, "WPA3 "); } if ( (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) || (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { - g_string_append (security_str, _("802.1X")); - g_string_append_c (security_str, ' '); + g_string_append (security_str, "802.1X "); } if (security_str->len > 0) @@ -1961,7 +1955,7 @@ connect_device_cb (GObject *client, GAsyncResult *result, gpointer user_data) if (nmc->secret_agent) { NMRemoteConnection *connection = nm_active_connection_get_connection (active); - nm_secret_agent_simple_enable (NM_SECRET_AGENT_SIMPLE (nmc->secret_agent), + nm_secret_agent_simple_enable (nmc->secret_agent, nm_connection_get_path (NM_CONNECTION (connection))); } @@ -3468,7 +3462,8 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv) /* WEP */ con_password = nm_setting_wireless_security_get_wep_key (s_wsec, 0); } else if ( (ap_wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) - || (ap_rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK)) { + || (ap_rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) + || (ap_rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE)) { /* WPA PSK */ con_password = nm_setting_wireless_security_get_psk (s_wsec); } @@ -3498,7 +3493,8 @@ do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv) wep_passphrase ? NM_WEP_KEY_TYPE_PASSPHRASE: NM_WEP_KEY_TYPE_KEY, NULL); } else if ( (ap_wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) - || (ap_rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK)) { + || (ap_rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK) + || (ap_rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE)) { /* WPA PSK */ g_object_set (s_wsec, NM_SETTING_WIRELESS_SECURITY_PSK, password, NULL); } diff --git a/clients/cli/general.c b/clients/cli/general.c index d9128c76..2c22bdc9 100644 --- a/clients/cli/general.c +++ b/clients/cli/general.c @@ -21,7 +21,6 @@ #include "general.h" -#include <string.h> #include <stdlib.h> #include "nm-common-macros.h" @@ -125,6 +124,8 @@ permission_to_string (NMClientPermission perm) return NM_AUTH_PERMISSION_ENABLE_DISABLE_STATISTICS; case NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK: return NM_AUTH_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK; + case NM_CLIENT_PERMISSION_WIFI_SCAN: + return NM_AUTH_PERMISSION_WIFI_SCAN; default: return _("unknown"); } diff --git a/clients/cli/nmcli.c b/clients/cli/nmcli.c index 7e8477cc..d7bc2a46 100644 --- a/clients/cli/nmcli.c +++ b/clients/cli/nmcli.c @@ -24,7 +24,6 @@ #include "nmcli.h" #include <stdio.h> -#include <string.h> #include <stdlib.h> #include <signal.h> #include <termios.h> @@ -256,7 +255,7 @@ usage (void) " -p, --pretty pretty output\n" " -s, --show-secrets allow displaying passwords\n" " -t, --terse terse output\n" - " -v, --version how program version\n" + " -v, --version show program version\n" " -w, --wait <seconds> set timeout waiting for finishing operations\n" "\n" "OBJECT\n" @@ -504,7 +503,7 @@ resolve_color_alias (const char *color) static const struct { const char *name; const char *alias; - } const aliases[] = { + } aliases[] = { { "reset", "0" }, { "bold", "1" }, { "white", "1;37" }, @@ -1013,15 +1012,15 @@ nmc_cleanup (NmCli *nmc) g_clear_object (&nmc->client); - g_string_free (nmc->return_text, TRUE); + if (nmc->return_text) + g_string_free (g_steal_pointer (&nmc->return_text), TRUE); if (nmc->secret_agent) { - /* Destroy secret agent if we have one. */ - nm_secret_agent_old_unregister (nmc->secret_agent, NULL, NULL); - g_object_unref (nmc->secret_agent); + nm_secret_agent_old_unregister (NM_SECRET_AGENT_OLD (nmc->secret_agent), NULL, NULL); + g_clear_object (&nmc->secret_agent); } - if (nmc->pwds_hash) - g_hash_table_destroy (nmc->pwds_hash); + + nm_clear_pointer (&nmc->pwds_hash, g_hash_table_destroy); nm_clear_g_free (&nmc->required_fields); diff --git a/clients/cli/nmcli.h b/clients/cli/nmcli.h index 0ccf1653..cd50333a 100644 --- a/clients/cli/nmcli.h +++ b/clients/cli/nmcli.h @@ -20,7 +20,7 @@ #ifndef NMC_NMCLI_H #define NMC_NMCLI_H -#include "nm-secret-agent-old.h" +#include "nm-secret-agent-simple.h" #include "nm-meta-setting-desc.h" struct _NMPolkitListener; @@ -129,7 +129,7 @@ typedef struct _NmCli { int timeout; /* Operation timeout */ - NMSecretAgentOld *secret_agent; /* Secret agent */ + NMSecretAgentSimple *secret_agent; /* Secret agent */ GHashTable *pwds_hash; /* Hash table with passwords in passwd-file */ struct _NMPolkitListener *pk_listener; /* polkit agent listener */ diff --git a/clients/cli/polkit-agent.c b/clients/cli/polkit-agent.c index b895599b..accb567f 100644 --- a/clients/cli/polkit-agent.c +++ b/clients/cli/polkit-agent.c @@ -22,7 +22,6 @@ #include "polkit-agent.h" #include <stdio.h> -#include <string.h> #include <sys/types.h> #include <unistd.h> diff --git a/clients/cli/utils.c b/clients/cli/utils.c index 1b940467..0e74ba88 100644 --- a/clients/cli/utils.c +++ b/clients/cli/utils.c @@ -23,9 +23,7 @@ #include "utils.h" #include <stdio.h> -#include <string.h> #include <stdlib.h> -#include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> @@ -1428,19 +1426,20 @@ pager_fallback (void) { char buf[64]; int rb; + int errsv; do { rb = read (STDIN_FILENO, buf, sizeof (buf)); if (rb == -1) { - if (errno == EINTR) { + errsv = errno; + if (errsv == EINTR) continue; - } else { - g_printerr (_("Error reading nmcli output: %s\n"), strerror (errno)); - _exit(EXIT_FAILURE); - } + g_printerr (_("Error reading nmcli output: %s\n"), nm_strerror_native (errsv)); + _exit(EXIT_FAILURE); } if (write (STDOUT_FILENO, buf, rb) == -1) { - g_printerr (_("Error writing nmcli output: %s\n"), strerror (errno)); + errsv = errno; + g_printerr (_("Error writing nmcli output: %s\n"), nm_strerror_native (errsv)); _exit(EXIT_FAILURE); } } while (rb > 0); @@ -1455,6 +1454,7 @@ nmc_terminal_spawn_pager (const NmcConfig *nmc_config) pid_t pager_pid; pid_t parent_pid; int fd[2]; + int errsv; if ( nmc_config->in_editor || nmc_config->print_output == NMC_PRINT_TERSE @@ -1464,7 +1464,8 @@ nmc_terminal_spawn_pager (const NmcConfig *nmc_config) return 0; if (pipe (fd) == -1) { - g_printerr (_("Failed to create pager pipe: %s\n"), strerror (errno)); + errsv = errno; + g_printerr (_("Failed to create pager pipe: %s\n"), nm_strerror_native (errsv)); return 0; } @@ -1472,7 +1473,8 @@ nmc_terminal_spawn_pager (const NmcConfig *nmc_config) pager_pid = fork (); if (pager_pid == -1) { - g_printerr (_("Failed to fork pager: %s\n"), strerror (errno)); + errsv = errno; + g_printerr (_("Failed to fork pager: %s\n"), nm_strerror_native (errsv)); nm_close (fd[0]); nm_close (fd[1]); return 0; @@ -1517,10 +1519,14 @@ nmc_terminal_spawn_pager (const NmcConfig *nmc_config) } /* Return in the parent */ - if (dup2 (fd[1], STDOUT_FILENO) < 0) - g_printerr (_("Failed to duplicate pager pipe: %s\n"), strerror (errno)); - if (dup2 (fd[1], STDERR_FILENO) < 0) - g_printerr (_("Failed to duplicate pager pipe: %s\n"), strerror (errno)); + if (dup2 (fd[1], STDOUT_FILENO) < 0) { + errsv = errno; + g_printerr (_("Failed to duplicate pager pipe: %s\n"), nm_strerror_native (errsv)); + } + if (dup2 (fd[1], STDERR_FILENO) < 0) { + errsv = errno; + g_printerr (_("Failed to duplicate pager pipe: %s\n"), nm_strerror_native (errsv)); + } nm_close (fd[0]); nm_close (fd[1]); |