Re: Change IP address with libnm



On Wed, 2020-02-26 at 17:45 +0000, António Mendes wrote:
Hi once again :)
I can finally see the print coming from connection_updated(). I added
loop = g_main_loop_new(NULL, FALSE) and g_main_loop_run(loop) to my
networkManager(). 

Hi,


It looks mostly good. Some minor comments below, but the overall
structure is sensible.



I still don't understand when you are saying to free GVariant
returned from nm_remote_connection_commit_changes_finish(). In
documentation, this function returns a gboolean.

You are right. I missed that.


Sorry for my noobish questions and thanks again for your help.

Code updated:

#include <glib.h>
#include <stdio.h>
#include <stdlib.h>

#include <NetworkManager.h>
#include <networkManagement.h>

static void connection_updated(GObject *connection,
                   GAsyncResult *result,
                   gpointer user_data)
{
    GMainLoop *loop = user_data;
    GError *error = NULL;
    gboolean success = FALSE;

    success =
nm_remote_connection_commit_changes_finish(NM_REMOTE_CONNECTION(conne
ction), result, &error);
    
    if (success == TRUE)
    {
        g_print("Connection Updated successfully\n");
    }
    else
    {
        g_print("Error updating connection: %s", error->message);
        g_error_free(error);
    }
    /* Tell the mainloop we're done and we can quit now */
    g_main_loop_quit(loop);
}

static void changeIpAddress(NMConnection *connection, GMainLoop
*loop)
{
    GError *error = NULL;
    NMSettingIPConfig *s_ip4;
    NMIPAddress *address;

    /* Build up the 'ipv4' Setting */
    s_ip4 = NM_SETTING_IP_CONFIG(nm_setting_ip4_config_new());

    address = nm_ip_address_new(AF_INET, "192.168.123.2", 24,
&error);
    if (address != NULL)

btw, this isn't going to fail. You see the arguments you pass to
nm_ip_address_new(), and they are clearly correct. libnm will never
fail the function in this case. You can assert against that.

Or... if you handle the theoretical error, then be aware that in the
error case the async operation is not started. That means, nobody is
going to call g_main_loop_quit(), and the run below will block forever.



    {
        g_object_set(G_OBJECT(s_ip4),
                     NM_SETTING_IP_CONFIG_METHOD,
NM_SETTING_IP4_CONFIG_METHOD_MANUAL,
                     NM_SETTING_IP_CONFIG_GATEWAY, "192.168.123.254",
                     NULL);

        nm_setting_ip_config_clear_addresses(s_ip4); //clear all
addresses

        printf("%s\n", nm_ip_address_get_address(address));

        nm_setting_ip_config_add_address(s_ip4, address);

        g_object_set(G_OBJECT(s_ip4),
                     NM_SETTING_IP_CONFIG_GATEWAY, "192.168.123.254",
                     NULL);

        nm_connection_add_setting(connection,
nm_setting_duplicate(NM_SETTING(s_ip4)));

        nm_remote_connection_commit_changes_async(NM_REMOTE_CONNECTIO
N(connection),
                                                  TRUE, NULL,
connection_updated, loop);
        nm_ip_address_unref(address);
    }
}

void networkManager()
{
    GError *error = NULL;
    NMConnection *connection;
    GMainLoop *loop;
    NMClient *client;

    loop = g_main_loop_new(NULL, FALSE);

You will leak @loop. You could use

"g_autoptr(GMainLoop) loop = NULL;"

above (on recent glib), or ensure to explicitly call
g_main_loop_unref().


    if (!(client = nm_client_new(NULL, &error)))
    {
        g_message("Error: Could not connect to NetworkManager: %s.",
error->message);
        g_error_free(error);
        return;
    }

    if (!nm_client_get_nm_running(client))
    {
        g_message("Error: Can't obtain connections: NetworkManager is
not running.");

leaks client.

        return;
    }

    connection = (NMConnection
*)nm_client_get_connection_by_id(client, "Wired connection 2");

Maybe handle @connection being NULL.



    changeIpAddress(connection, loop);

    g_main_loop_run(loop);


    g_object_unref(client);
}
_

Attachment: signature.asc
Description: This is a digitally signed message part



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]