Ignore unexpected DHCP messages - sdhcp - simple dhcp client
 (HTM) git clone git://git.codemadness.org/sdhcp
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit f397bb3ea1de20c1cac1baf2e091f2ec8c79ec82
 (DIR) parent 219b8fe1c38097c37de89b0c8c2aa771ebe1daff
 (HTM) Author: Michael Forney <mforney@mforney.org>
       Date:   Wed, 14 Nov 2018 18:40:35 -0800
       
       Ignore unexpected DHCP messages
       
       Diffstat:
         M sdhcp.c                             |      92 ++++++++++++++++---------------
       
       1 file changed, 47 insertions(+), 45 deletions(-)
       ---
 (DIR) diff --git a/sdhcp.c b/sdhcp.c
       @@ -356,30 +356,30 @@ Init:
                alarm(1);
                goto Selecting;
        Selecting:
       -        switch (dhcprecv()) {
       -        case DHCPoffer:
       -                alarm(0);
       -                memcpy(client, bp.yiaddr, sizeof(client));
       -                optget(&bp, server, ODserverid, sizeof(server));
       -                optget(&bp, mask, OBmask, sizeof(mask));
       -                optget(&bp, router, OBrouter, sizeof(router));
       -                optget(&bp, dns, OBdnsserver, sizeof(dns));
       -                optget(&bp, &t1, ODlease, sizeof(t1));
       -                t1 = ntohl(t1);
       -                dhcpsend(DHCPrequest, Broadcast);
       -                goto Requesting;
       -        case Timeout:
       -                goto Init;
       -        default:
       -                goto Selecting;
       +        for (;;) {
       +                switch (dhcprecv()) {
       +                case DHCPoffer:
       +                        alarm(0);
       +                        memcpy(client, bp.yiaddr, sizeof(client));
       +                        optget(&bp, server, ODserverid, sizeof(server));
       +                        optget(&bp, mask, OBmask, sizeof(mask));
       +                        optget(&bp, router, OBrouter, sizeof(router));
       +                        optget(&bp, dns, OBdnsserver, sizeof(dns));
       +                        optget(&bp, &t1, ODlease, sizeof(t1));
       +                        t1 = ntohl(t1);
       +                        dhcpsend(DHCPrequest, Broadcast);
       +                        goto Requesting;
       +                case Timeout:
       +                        goto Init;
       +                }
                }
        Requesting:
       -        switch (dhcprecv()) {
       -        case DHCPoffer:
       -                goto Requesting; /* ignore other offers. */
       -        case DHCPack:
       -                acceptlease();
       -                goto Bound;
       +        for (;;) {
       +                switch (dhcprecv()) {
       +                case DHCPack:
       +                        acceptlease();
       +                        goto Bound;
       +                }
                }
        Bound:
                fputs("Congrats! You should be on the 'net.\n", stdout);
       @@ -388,33 +388,35 @@ Bound:
                                exit(0);
                        forked = 1;
                }
       -        switch (dhcprecv()) {
       -        case DHCPoffer:
       -        case DHCPack:
       -        case DHCPnak:
       -                goto Bound; /* discard offer, ACK or NAK */
       -        case Timeout:
       -                dhcpsend(DHCPrequest, Unicast);
       -                goto Renewing;
       +        for (;;) {
       +                switch (dhcprecv()) {
       +                case Timeout:
       +                        dhcpsend(DHCPrequest, Unicast);
       +                        goto Renewing;
       +                }
                }
        Renewing:
       -        switch (dhcprecv()) {
       -        case DHCPack:
       -                acceptlease();
       -                goto Bound;
       -        case DHCPnak:
       -                goto Init;
       -        case Timeout:
       -                dhcpsend(DHCPrequest, Broadcast);
       -                goto Rebinding;
       +        for (;;) {
       +                switch (dhcprecv()) {
       +                case DHCPack:
       +                        acceptlease();
       +                        goto Bound;
       +                case DHCPnak:
       +                        goto Init;
       +                case Timeout:
       +                        dhcpsend(DHCPrequest, Broadcast);
       +                        goto Rebinding;
       +                }
                }
        Rebinding:
       -        switch (dhcprecv()) {
       -        case DHCPnak: /* lease expired */
       -                goto Init;
       -        case DHCPack:
       -                acceptlease();
       -                goto Bound;
       +        for (;;) {
       +                switch (dhcprecv()) {
       +                case DHCPnak: /* lease expired */
       +                        goto Init;
       +                case DHCPack:
       +                        acceptlease();
       +                        goto Bound;
       +                }
                }
        }