code-style, remove debug.c, config.mk: default c99 - sdhcp - simple dhcp client
 (HTM) git clone git://git.codemadness.org/sdhcp
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit d64b498944cd8ca265e167f130992dff5b744e68
 (DIR) parent 2a32d2ca9330dbf0c660827daf2da3d3e657697d
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Mon, 27 Apr 2015 22:59:41 +0200
       
       code-style, remove debug.c, config.mk: default c99
       
       Diffstat:
         M TODO                                |       5 +----
         M config.mk                           |       5 ++---
         D debug.c                             |     148 -------------------------------
         M sdhcp.c                             |      90 ++++++++++++++------------------
         M util/eprintf.c                      |      14 ++++++--------
       
       5 files changed, 48 insertions(+), 214 deletions(-)
       ---
 (DIR) diff --git a/TODO b/TODO
       @@ -2,9 +2,6 @@ TODO:
        [ ] manual check memcpy bounds.
        [ ] add flag (-s?) to probe a specific DHCP server, not broadcast?
            probably skip in run() Init: etc stages.
       -[ ] sane default value for client-id and test it.
       -[ ] add new options to man page (-d, -i).
       -[ ] update LICENSE.
        [ ] replace unsigned char ip[4] and so on from function declarations.
        [?] ipv6 support ?
        
       @@ -20,7 +17,6 @@ Changed (for now):
                - typos:
                        - sdhcp.c: interface typo.
                        - sdhcp.1: shdcp typo.
       -        - make exit([01]), EXIT_SUCCESS or EXIT_FAILURE.
                - replace write() for stdout messages with fprintf()
                - replace die() with eprintf().
                - makefile:
       @@ -33,6 +29,7 @@ Changed (for now):
                          "vaio".
                        - add -d flag, don't update /etc/resolv.conf.
                        - add -i flag, don't set ip.
       +                - add -f flag, run in foreground.
                        - add -e flag, run program, this has the following variables set:
                          $SERVER, DHCP ip.
                          $DNS, DNS ip.
 (DIR) diff --git a/config.mk b/config.mk
       @@ -6,8 +6,7 @@ DESTDIR   =
        MANPREFIX = $(PREFIX)/share/man
        
        CC        = cc
       -#CC       = musl-gcc
        LD        = $(CC)
        CPPFLAGS  = -D_BSD_SOURCE
       -CFLAGS    = -g -Wall -Wextra -O0 -ansi $(CPPFLAGS)
       -LDFLAGS   = -g
       +CFLAGS    = -Wall -Wextra -pedantic -std=c99 $(CPPFLAGS)
       +LDFLAGS   =
 (DIR) diff --git a/debug.c b/debug.c
       @@ -1,148 +0,0 @@
       -#include <stdarg.h>
       -
       -void bpdump(unsigned char *p, int n);
       -
       -unsigned short
       -nhgets(unsigned char c[2])
       -{
       -        return ((c[0] << 8) + c[1]) & 0xffff;
       -}
       -
       -unsigned long
       -nhgetl(unsigned char c[4])
       -{
       -        return (nhgets(c) << 16) + nhgets(c + 2);
       -}
       -
       -char *
       -ipstr(unsigned char *ip)
       -{
       -        char * ch = malloc(3 * 4 + 3 + 10);
       -        sprintf(ch, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
       -        return ch;
       -}
       -
       -#if 0
       -void
       -dbgprintf(char *str, ...)
       -{
       -        va_list ap;
       -        va_start(ap, str);
       -        vfprintf(stderr, str, ap);
       -        va_end(ap);
       -}
       -#endif
       -
       -void
       -bpdump(unsigned char *p, int n)
       -{
       -        int len, i, code;
       -        Bootp *bp;
       -        unsigned char type;
       -        char *types[] = {
       -                "discover", "offer", "request",
       -                "decline", "ack", "nak", "release", "inform"
       -        };
       -        /* Udphdr *up; */
       -
       -        bp = (Bootp*)p;
       -        /* up = (Udphdr*)bp->udphdr; */
       -
       -        if(n < bp->magic - p) {
       -                fprintf(stderr, "dhcpclient: short bootp packet");
       -                return;
       -        }
       -
       -        optget(bp, &type, ODtype, sizeof type);
       -        fprintf(stderr, "DHCP%s\n", types[type - 1]);
       -        /* fprintf(stderr, "laddr=%I lport=%d raddr=%I rport=%d\n", up->laddr,
       -        nhgets(up->lport), up->raddr, nhgets(up->rport)); */
       -        fprintf(stderr, "op = %d htype = %d hlen = %d hops = %d\n", *bp->op, *bp->htype,
       -                *bp->hlen, *bp->hops);
       -        fprintf(stderr, "xid = %x secs = %d flags = %x\n", nhgetl(bp->xid),
       -                nhgets(bp->secs), nhgets(bp->flags));
       -        fprintf(stderr, "ciaddr = %s, yiaddr = %s, siaddr = %s, giaddr = %s\n",
       -                ipstr(bp->ciaddr), ipstr(bp->yiaddr), ipstr(bp->siaddr), ipstr(bp->giaddr));
       -        fprintf(stderr, "chaddr =");
       -        for(i=0; i<15; i++)
       -                fprintf(stderr, "%.2x:", bp->chaddr[i]);
       -        fprintf(stderr, "%.2x\n", bp->chaddr[15]);
       -        fprintf(stderr, "sname = %s\n", bp->sname);
       -        fprintf(stderr, "file = %s\n", bp->file);
       -
       -        n -= bp->magic - p;
       -        p = bp->magic;
       -
       -        if(n < 4)
       -                return;
       -        if(memcmp(magic, p, 4) != 0)
       -                fprintf(stderr, "dhcpclient: bad opt magic %#x %#x %#x %#x\n",
       -                        p[0], p[1], p[2], p[3]);
       -        p += 4;
       -        n -= 4;
       -
       -        while(n > 0) {
       -                code = *p++;
       -                n--;
       -                if(code == OBpad)
       -                        continue;
       -                if(code == OBend)
       -                        break;
       -                if(n == 0) {
       -                        fprintf(stderr, " bad option: %d", code);
       -                        return;
       -                }
       -                len = *p++;
       -                n--;
       -                if(len > n) {
       -                        fprintf(stderr, " bad option: %d", code);
       -                        return;
       -                }
       -                switch(code) {
       -                case ODtype:
       -                        fprintf(stderr, "DHCP type %d\n", p[0]);
       -                        break;
       -                case ODclientid:
       -                        fprintf(stderr, "client id=");
       -                        for(i = 0; i<len; i++)
       -                                fprintf(stderr, "%x ", p[i]);
       -                        fprintf(stderr, "\n");
       -                        break;
       -                case ODlease:
       -                        fprintf(stderr, "lease=%d sec\n", nhgetl(p));
       -                        break;
       -                case ODserverid:
       -                        fprintf(stderr, "server id=%s\n", ipstr(p));
       -                        break;
       -                case OBmask:
       -                        fprintf(stderr, "mask=%s\n", ipstr(p));
       -                        break;
       -                case OBrouter:
       -                        fprintf(stderr, "router=%s\n", ipstr(p));
       -                        break;
       -                case ODipaddr:
       -                        fprintf(stderr, "ip addr=%s\n", ipstr(p));
       -                        break;
       -                case OBdnsserver:
       -                        fprintf(stderr, "dns=%s\n", ipstr(p));
       -                        break;
       -                case OBbaddr:
       -                        fprintf(stderr, "broadcast=%s\n", ipstr(p));
       -                        break;
       -                case ODrenewaltime:
       -                        fprintf(stderr, "renew time=%d sec\n", nhgetl(p));
       -                        break;
       -                case ODrebindingtime:
       -                        fprintf(stderr, "rebind time=%d sec\n", nhgetl(p));
       -                        break;
       -                default:
       -                        fprintf(stderr, "unknown option %d\n", code);
       -                        for(i = 0; i<len; i++)
       -                                fprintf(stderr, "%x ", p[i]);
       -                        fprintf(stderr, "\n");
       -                        break;
       -                }
       -                p += len;
       -                n -= len;
       -        }
       -}
 (DIR) diff --git a/sdhcp.c b/sdhcp.c
       @@ -108,7 +108,7 @@ hnput(unsigned char *dst, unsigned long long src, size_t n)
        {
                unsigned int i;
        
       -        for(i = 0; n--; i++)
       +        for (i = 0; n--; i++)
                        dst[i] = (src >> (n * 8)) & 0xff;
        }
        
       @@ -120,6 +120,7 @@ iptoaddr(struct sockaddr *ifaddr, unsigned char ip[4], int port)
                in->sin_family = AF_INET;
                in->sin_port = htons(port);
                memcpy(&(in->sin_addr), ip, sizeof in->sin_addr);
       +
                return ifaddr;
        }
        
       @@ -132,8 +133,9 @@ udpsend(unsigned char ip[4], int fd, void *data, size_t n)
                ssize_t sent;
        
                iptoaddr(&addr, ip, 67); /* bootp server */
       -        if((sent = sendto(fd, data, n, 0, &addr, addrlen)) == -1)
       +        if ((sent = sendto(fd, data, n, 0, &addr, addrlen)) == -1)
                        eprintf("sendto:");
       +
                return sent;
        }
        
       @@ -146,8 +148,9 @@ udprecv(unsigned char ip[4], int fd, void *data, size_t n)
                ssize_t r;
        
                iptoaddr(&addr, ip, 68); /* bootp client */
       -        if((r = recvfrom(fd, data, n, 0, &addr, &addrlen)) == -1)
       +        if ((r = recvfrom(fd, data, n, 0, &addr, &addrlen)) == -1)
                        eprintf("recvfrom:");
       +
                return r;
        }
        
       @@ -163,7 +166,7 @@ setip(unsigned char ip[4], unsigned char mask[4], unsigned char gateway[4])
        
                strlcpy(ifreq.ifr_name, ifname, IF_NAMESIZE);
                iptoaddr(&(ifreq.ifr_addr), ip, 0);
       -        if((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == -1)
       +        if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == -1)
                        eprintf("can't set ip, socket:");
                ioctl(fd, SIOCSIFADDR, &ifreq);
                iptoaddr(&(ifreq.ifr_netmask), mask, 0);
       @@ -186,9 +189,9 @@ cat(int dfd, char *src)
                char buf[BUFSIZ];
                int n, fd;
        
       -        if((fd = open(src, O_RDONLY)) == -1)
       +        if ((fd = open(src, O_RDONLY)) == -1)
                        return; /* can't read, but don't error out */
       -        while((n = read(fd, buf, sizeof buf)) > 0)
       +        while ((n = read(fd, buf, sizeof buf)) > 0)
                        write(dfd, buf, n);
                close(fd);
        }
       @@ -199,12 +202,12 @@ setdns(unsigned char dns[4])
                char buf[128];
                int fd;
        
       -        if((fd = creat("/etc/resolv.conf", 0644)) == -1) {
       +        if ((fd = creat("/etc/resolv.conf", 0644)) == -1) {
                        weprintf("can't change /etc/resolv.conf:");
                        return;
                }
                cat(fd, "/etc/resolv.conf.head");
       -        if(snprintf(buf, sizeof(buf) - 1, "\nnameserver %d.%d.%d.%d\n",
       +        if (snprintf(buf, sizeof(buf) - 1, "\nnameserver %d.%d.%d.%d\n",
                         dns[0], dns[1], dns[2], dns[3]) > 0)
                        write(fd, buf, strlen(buf));
                cat(fd, "/etc/resolv.conf.tail");
       @@ -218,18 +221,18 @@ optget(Bootp *bp, void *data, int opt, int n)
                unsigned char *top = ((unsigned char *)bp) + sizeof *bp;
                int code, len;
        
       -        while(p < top) {
       +        while (p < top) {
                        code = *p++;
       -                if(code == OBpad)
       +                if (code == OBpad)
                                continue;
       -                if(code == OBend || p == top)
       +                if (code == OBend || p == top)
                                break;
                        len = *p++;
       -                if(len > top - p)
       +                if (len > top - p)
                                break;
       -                if(code == opt) {
       +                if (code == opt) {
                                memcpy(data, p, MIN(len, n));
       -                        return;
       +                        break;
                        }
                        p += len;
                }
       @@ -241,6 +244,7 @@ optput(unsigned char *p, int opt, unsigned char *data, size_t len)
                *p++ = opt;
                *p++ = (unsigned char)len;
                memcpy(p, data, len);
       +
                return p + len;
        }
        
       @@ -250,6 +254,7 @@ hnoptput(unsigned char *p, int opt, long long data, size_t len)
                *p++ = opt;
                *p++ = (unsigned char)len;
                hnput(p, data, len);
       +
                return p + len;
        }
        
       @@ -303,14 +308,15 @@ dhcprecv(void)
                pfd.events = POLLIN;
        
                memset(&bp, 0, sizeof bp);
       -        if(poll(&pfd, 1, -1) == -1) {
       -                if(errno != EINTR)
       +        if (poll(&pfd, 1, -1) == -1) {
       +                if (errno != EINTR)
                                eprintf("poll:");
                        else
                                return Timeout;
                }
                udprecv(IP(255, 255, 255, 255), sock, &bp, sizeof bp);
                optget(&bp, &type, ODtype, sizeof type);
       +
                return type;
        }
        
       @@ -319,11 +325,11 @@ acceptlease(void)
        {
                char buf[128];
        
       -        if(iflag == 1)
       +        if (iflag)
                        setip(client, mask, router);
       -        if(dflag == 1)
       +        if (dflag)
                        setdns(dns);
       -        if(*program) {
       +        if (*program) {
                        snprintf(buf, sizeof(buf), "%d.%d.%d.%d", server[0], server[1], server[2], server[3]);
                        setenv("SERVER", buf, 1);
                        snprintf(buf, sizeof(buf), "%d.%d.%d.%d", client[0], client[1], client[2], client[3]);
       @@ -344,20 +350,6 @@ run(void)
        {
                int forked = 0;
        
       -#if 0
       -InitReboot:
       -        /* send DHCPrequest to old server */
       -        dhcpsend(DHCPrequest, Broadcast);
       -        goto Rebooting;
       -Rebooting:
       -        switch (dhcprecv()) {
       -        case DHCPnak:
       -                goto Init;
       -        case DHCPack:
       -                acceptoffer();
       -                goto Bound;
       -        }
       -#endif
        Init:
                dhcpsend(DHCPdiscover, Broadcast);
                alarm(1);
       @@ -384,20 +376,15 @@ Requesting:
                switch(dhcprecv()) {
                case DHCPoffer:
                        goto Requesting; /* ignore other offers. */
       -#if 0
       -        case DHCPack: /* (and you don't want it) ? */
       -                dhcpsend(DHCPdecline, Unicast);
       -                goto Init;
       -#endif
                case DHCPack:
                        acceptlease();
                        goto Bound;
                }
        Bound:
                fputs("Congrats! You should be on the 'net.\n", stdout);
       -        if(!fflag && !forked) {
       -                if(fork())
       -                        exit(EXIT_SUCCESS);
       +        if (!fflag && !forked) {
       +                if (fork())
       +                        exit(0);
                        forked = 1;
                }
                switch (dhcprecv()) {
       @@ -441,13 +428,13 @@ void cleanexit(int unused)
        {
                (void) unused;
                dhcpsend(DHCPrelease, Unicast);
       -        exit(EXIT_SUCCESS);
       +        exit(0);
        }
        
        static void
        usage(void)
        {
       -        eprintf("usage: sdhcp [-d] [-e program] [-f] [-i] [ifname] [clientid]\n");
       +        eprintf("usage: %s [-d] [-e program] [-f] [-i] [ifname] [clientid]\n", argv0);
        }
        
        int
       @@ -476,36 +463,37 @@ main(int argc, char *argv[])
                        break;
                } ARGEND;
        
       -        if(argc >= 1)
       +        if (argc)
                        ifname = argv[0]; /* interface name */
       -        if(argc >= 2)
       +        if (argc >= 2)
                        cid = argv[1]; /* client-id */
        
                memset(&ifreq, 0, sizeof(ifreq));
                signal(SIGALRM, nop);
                signal(SIGTERM, cleanexit);
        
       -        if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
       +        if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
                        eprintf("socket:");
       -        if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &bcast, sizeof bcast) == -1)
       +        if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &bcast, sizeof bcast) == -1)
                        eprintf("setsockopt:");
        
                strlcpy(ifreq.ifr_name, ifname, IF_NAMESIZE);
                ioctl(sock, SIOCGIFINDEX, &ifreq);
       -        if(setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof ifreq) == -1)
       +        if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof ifreq) == -1)
                        eprintf("setsockopt:");
                iptoaddr(&addr, IP(255, 255, 255, 255), 68);
       -        if(bind(sock, (void*)&addr, sizeof addr) != 0)
       +        if (bind(sock, (void*)&addr, sizeof addr) != 0)
                        eprintf("bind:");
                ioctl(sock, SIOCGIFHWADDR, &ifreq);
                memcpy(hwaddr, ifreq.ifr_hwaddr.sa_data, sizeof ifreq.ifr_hwaddr.sa_data);
        
       -        if((rnd = open("/dev/urandom", O_RDONLY)) == -1)
       +        if ((rnd = open("/dev/urandom", O_RDONLY)) == -1)
                        eprintf("can't open /dev/urandom to generate unique transaction identifier:");
                read(rnd, xid, sizeof xid);
                close(rnd);
        
                starttime = time(NULL);
                run();
       -        return EXIT_SUCCESS;
       +
       +        return 0;
        }
 (DIR) diff --git a/util/eprintf.c b/util/eprintf.c
       @@ -16,7 +16,7 @@ eprintf(const char *fmt, ...)
                va_list ap;
        
                va_start(ap, fmt);
       -        venprintf(EXIT_FAILURE, fmt, ap);
       +        venprintf(1, fmt, ap);
                va_end(ap);
        }
        
       @@ -33,13 +33,12 @@ enprintf(int status, const char *fmt, ...)
        void
        venprintf(int status, const char *fmt, va_list ap)
        {
       -#ifdef DEBUG
       -        fprintf(stderr, "%s: ", argv0);
       -#endif
       +        if (strncmp(fmt, "usage", strlen("usage")))
       +                fprintf(stderr, "%s: ", argv0);
        
                vfprintf(stderr, fmt, ap);
        
       -        if(fmt[0] && fmt[strlen(fmt)-1] == ':') {
       +        if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
                        fputc(' ', stderr);
                        perror(NULL);
                }
       @@ -52,9 +51,8 @@ weprintf(const char *fmt, ...)
        {
                va_list ap;
        
       -#ifdef DEBUG
       -        fprintf(stderr, "%s: ", argv0);
       -#endif
       +        if (strncmp(fmt, "usage", strlen("usage")))
       +                fprintf(stderr, "%s: ", argv0);
        
                va_start(ap, fmt);
                vfprintf(stderr, fmt, ap);