[systemd-devel] [PATCH 28/28] dhcp: Use callback in test client

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Wed Nov 13 17:52:45 PST 2013


On Wed, Nov 13, 2013 at 11:22:56PM +0200, Patrik Flykt wrote:
> Print out the event received and possibly also IP related data.
> ---
>  src/dhcp/dhcp-example-client.c |   53 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 53 insertions(+)
> 
> diff --git a/src/dhcp/dhcp-example-client.c b/src/dhcp/dhcp-example-client.c
> index afb7102..3635bd8 100644
> --- a/src/dhcp/dhcp-example-client.c
> +++ b/src/dhcp/dhcp-example-client.c
> @@ -24,6 +24,9 @@
>  #include <unistd.h>
>  #include <net/ethernet.h>
>  #include <errno.h>
> +#include <sys/socket.h>
> +#include <netinet/in.h>
> +#include <arpa/inet.h>
>  
>  #include "client.h"
>  
> @@ -79,6 +82,52 @@ static int get_index(char *ifname)
>          return ifr.ifr_ifindex;
>  }
>  
> +static const char *print_event(int event)
Can this be called event_to_string?

> +{
> +        if (event < 0)
> +                return strerror(-event);
> +
> +        switch (event) {
> +        case DHCP_EVENT_STOP:
> +                return "Stopped";
> +        case DHCP_EVENT_NAK:
> +                return "DHCP NAK";
> +        case DHCP_EVENT_IP_ACQUIRE:
> +                return "DHCP address acquired";
> +        case DHCP_EVENT_IP_CHANGE:
> +                return "DHCP address changed";
> +        case DHCP_EVENT_EXPIRED:
> +                return "DHCP lease expired";
> +        default:
> +                break;
> +        }
> +
> +        return "unknown";
> +}
> +
> +static void print_state(DHCPClient *client, int event, void *userdata)
> +{
> +        sd_event *e = userdata;
> +        struct in_addr addr;
> +
> +        if (event < 0) {
> +                printf("Error %d %s\n", event, print_event(event));
> +                sd_event_unref(e);
> +                return;
> +        }
So e is unrefed only sometimes... This seems confusing.

> +
> +        printf("Event %s\n", print_event(event));
> +
> +        if (dhcp_client_get_address(client, &addr) >= 0)
> +                printf("Address %s\n", inet_ntoa(addr));
> +
> +        if (dhcp_client_get_netmask(client, &addr) >= 0)
> +                printf("Netmask %s\n", inet_ntoa(addr));
> +
> +        if (dhcp_client_get_router(client, &addr) >= 0)
> +                printf("Default router %s\n", inet_ntoa(addr));
> +}
> +
>  int main(int argc, char **argv)
>  {
>          DHCPClient *client;
> @@ -109,9 +158,13 @@ int main(int argc, char **argv)
>          printf("Interface %s index %d\n", argv[1], index);
>          dhcp_client_set_index(client, index);
>          dhcp_client_set_mac(client, &mac);
> +        dhcp_client_set_callback(client, print_state, &event);
>  
>          dhcp_client_start(client);
>          sd_event_loop(event);
>  
> +        dhcp_client_free(client);
> +        printf("Exit\n");
> +
>          return 0;
>  }
Hm, since this is just example code, then probably it doesn't matter that
much :)

Zbyszek


More information about the systemd-devel mailing list