diff options
Diffstat (limited to 'src/core/nm-core-utils.c')
| -rw-r--r-- | src/core/nm-core-utils.c | 84 |
1 files changed, 66 insertions, 18 deletions
diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c index 4aad9414..500bffb9 100644 --- a/src/core/nm-core-utils.c +++ b/src/core/nm-core-utils.c @@ -58,7 +58,7 @@ G_STATIC_ASSERT(sizeof(NMUtilsTestFlags) <= sizeof(int)); static int _nm_utils_testing = 0; gboolean -nm_utils_get_testing_initialized() +nm_utils_get_testing_initialized(void) { NMUtilsTestFlags flags; @@ -69,7 +69,7 @@ nm_utils_get_testing_initialized() } NMUtilsTestFlags -nm_utils_get_testing() +nm_utils_get_testing(void) { NMUtilsTestFlags flags; @@ -2333,14 +2333,14 @@ nm_utils_log_connection_diff(NMConnection *connection, for (i = 0; i < sorted_hashes->len; i++) { LogConnectionSettingData *setting_data = - &g_array_index(sorted_hashes, LogConnectionSettingData, i); + &nm_g_array_index(sorted_hashes, LogConnectionSettingData, i); _log_connection_sort_names(setting_data, sorted_names); print_setting_header = TRUE; for (j = 0; j < sorted_names->len; j++) { char *str_conn, *str_diff; LogConnectionSettingItem *item = - &g_array_index(sorted_names, LogConnectionSettingItem, j); + &nm_g_array_index(sorted_names, LogConnectionSettingItem, j); str_conn = (item->diff_result & NM_SETTING_DIFF_RESULT_IN_A) ? _log_connection_get_property(setting_data->setting, item->item_name) @@ -2717,11 +2717,17 @@ _host_id_hash_v2(const guint8 *seed_arr, const UuidData *machine_id_data; char slen[100]; - /* - (stat -c '%s' /var/lib/NetworkManager/secret_key; - echo -n ' '; - cat /var/lib/NetworkManager/secret_key; - cat /etc/machine-id | tr -d '\n' | sed -n 's/[a-f0-9-]/\0/pg') | sha256sum + /* The following snippet generates the same (binary) host-id: + + ( + stat -c '%s' /var/lib/NetworkManager/secret_key | tr -d '\n'; + echo -n ' '; + cat /var/lib/NetworkManager/secret_key; + cat /etc/machine-id | tr -d '\n' | sed -n 's/[a-f0-9-]/\0/pg' + ) \ + | sha256sum \ + | awk '{print $1}' \ + | xxd -r -p */ nm_sprintf_buf(slen, "%" G_GSIZE_FORMAT " ", seed_len); @@ -3013,7 +3019,7 @@ nmtst_utils_host_id_pop(void) nm_log_dbg(LOGD_CORE, "nmtst: host-id pop"); - h = &g_array_index(nmtst_host_id_stack, HostIdData, nmtst_host_id_stack->len - 1); + h = &nm_g_array_index(nmtst_host_id_stack, HostIdData, nmtst_host_id_stack->len - 1); g_free((char *) h->host_id); g_array_set_size(nmtst_host_id_stack, nmtst_host_id_stack->len - 1u); @@ -3022,7 +3028,7 @@ nmtst_utils_host_id_pop(void) &host_id_static, h, nmtst_host_id_stack->len == 0u ? nmtst_host_id_static_0 - : nm_g_array_last(nmtst_host_id_stack, HostIdData))) + : &nm_g_array_last(nmtst_host_id_stack, HostIdData))) g_assert_not_reached(); } @@ -3864,7 +3870,7 @@ nm_utils_dhcp_client_id_duid(guint32 iaid, const guint8 *duid, gsize duid_len) guint8 type; guint32 iaid; guint8 duid[]; - } * client_id; + } *client_id; gsize total_size; /* the @duid must include the 16 bit duid-type and the data (of max 128 bytes). */ @@ -3914,7 +3920,7 @@ nm_utils_dhcp_client_id_systemd_node_specific_full(guint32 iaid, } en; }; } duid; - } * client_id; + } *client_id; guint64 u64; g_return_val_if_fail(machine_id, NULL); @@ -4193,7 +4199,7 @@ nm_utils_get_reverse_dns_domains_ip_6(const struct in6_addr *ip, guint8 plen, GP return; memcpy(&addr, ip, sizeof(struct in6_addr)); - nm_utils_ip6_address_clear_host_address(&addr, NULL, plen); + nm_ip6_addr_clear_host_address(&addr, NULL, plen); /* Number of nibbles to include in domains */ nibbles = (plen - 1) / 4 + 1; @@ -4338,7 +4344,7 @@ skip: result = g_new(char *, paths->len + 1); for (i = 0; i < paths->len; i++) - result[i] = g_array_index(paths, struct plugin_info, i).path; + result[i] = nm_g_array_index(paths, struct plugin_info, i).path; result[i] = NULL; g_array_free(paths, TRUE); @@ -4862,11 +4868,14 @@ typedef struct { int child_stdin; int child_stdout; + int child_stderr; GSource *input_source; GSource *output_source; + GSource *error_source; NMStrBuf in_buffer; NMStrBuf out_buffer; + NMStrBuf err_buffer; gsize out_buffer_offset; } HelperInfo; @@ -4902,13 +4911,17 @@ helper_info_free(gpointer data) nm_str_buf_destroy(&info->in_buffer); nm_str_buf_destroy(&info->out_buffer); + nm_str_buf_destroy(&info->err_buffer); nm_clear_g_source_inst(&info->input_source); nm_clear_g_source_inst(&info->output_source); + nm_clear_g_source_inst(&info->error_source); if (info->child_stdout != -1) nm_close(info->child_stdout); if (info->child_stdin != -1) nm_close(info->child_stdin); + if (info->child_stderr != -1) + nm_close(info->child_stderr); if (info->pid != -1) { nm_assert(info->pid > 1); @@ -4922,6 +4935,10 @@ static void helper_complete(HelperInfo *info, GError *error) { if (error) { + if (info->err_buffer.len > 0) { + _LOG2T(info, "stderr: %s", nm_str_buf_get_str(&info->err_buffer)); + } + nm_clear_g_cancellable_disconnect(g_task_get_cancellable(info->task), &info->cancellable_id); g_task_return_error(info->task, error); @@ -5017,6 +5034,24 @@ helper_have_data(int fd, GIOCondition condition, gpointer user_data) return G_SOURCE_CONTINUE; } +static gboolean +helper_have_err_data(int fd, GIOCondition condition, gpointer user_data) +{ + HelperInfo *info = user_data; + gssize n_read; + + n_read = nm_utils_fd_read(fd, &info->err_buffer); + + if (n_read > 0) + return G_SOURCE_CONTINUE; + + nm_clear_g_source_inst(&info->error_source); + nm_close(info->child_stderr); + info->child_stderr = -1; + + return G_SOURCE_CONTINUE; +} + static void helper_child_terminated(GPid pid, int status, gpointer user_data) { @@ -5092,10 +5127,11 @@ nm_utils_spawn_helper(const char *const *args, &info->pid, &info->child_stdin, &info->child_stdout, - NULL, + &info->child_stderr, &error)) { info->child_stdin = -1; info->child_stdout = -1; + info->child_stderr = -1; info->pid = -1; g_task_return_error(info->task, g_error_new(NM_UTILS_ERROR, @@ -5124,9 +5160,11 @@ nm_utils_spawn_helper(const char *const *args, fcntl(info->child_stdin, F_SETFL, fd_flags | O_NONBLOCK); fd_flags = fcntl(info->child_stdout, F_GETFD, 0); fcntl(info->child_stdout, F_SETFL, fd_flags | O_NONBLOCK); + fd_flags = fcntl(info->child_stderr, F_GETFD, 0); + fcntl(info->child_stderr, F_SETFL, fd_flags | O_NONBLOCK); /* Watch process stdin */ - info->out_buffer = NM_STR_BUF_INIT(32, TRUE); + info->out_buffer = NM_STR_BUF_INIT(NM_UTILS_GET_NEXT_REALLOC_SIZE_40, TRUE); for (arg = args; *arg; arg++) { nm_str_buf_append(&info->out_buffer, *arg); nm_str_buf_append_c(&info->out_buffer, '\0'); @@ -5140,7 +5178,7 @@ nm_utils_spawn_helper(const char *const *args, g_source_attach(info->output_source, g_main_context_get_thread_default()); /* Watch process stdout */ - info->in_buffer = NM_STR_BUF_INIT(NM_UTILS_GET_NEXT_REALLOC_SIZE_1000, FALSE); + info->in_buffer = NM_STR_BUF_INIT(0, FALSE); info->input_source = nm_g_unix_fd_source_new(info->child_stdout, G_IO_IN | G_IO_ERR | G_IO_HUP, G_PRIORITY_DEFAULT, @@ -5149,6 +5187,16 @@ nm_utils_spawn_helper(const char *const *args, NULL); g_source_attach(info->input_source, g_main_context_get_thread_default()); + /* Watch process stderr */ + info->err_buffer = NM_STR_BUF_INIT(0, FALSE); + info->error_source = nm_g_unix_fd_source_new(info->child_stderr, + G_IO_IN | G_IO_ERR | G_IO_HUP, + G_PRIORITY_DEFAULT, + helper_have_err_data, + info, + NULL); + g_source_attach(info->error_source, g_main_context_get_thread_default()); + if (cancellable) { gulong signal_id; |