Introduction
Introduction Statistics Contact Development Disclaimer Help
code-style, remove debug.c, config.mk: default c99 - sdhcp - simple dhcp client
git clone git://git.codemadness.org/sdhcp
Log
Files
Refs
LICENSE
---
commit d64b498944cd8ca265e167f130992dff5b744e68
parent 2a32d2ca9330dbf0c660827daf2da3d3e657697d
Author: Hiltjo Posthuma <[email protected]>
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(-)
---
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 s…
$SERVER, DHCP ip.
$DNS, DNS ip.
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 =
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->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…
- 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;
- }
-}
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 …
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 …
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…
*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 …
*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]…
setenv("SERVER", buf, 1);
snprintf(buf, sizeof(buf), "%d.%d.%d.%d", client[0], client[1]…
@@ -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]\…
+ eprintf("usage: %s [-d] [-e program] [-f] [-i] [ifname] [clientid]\n",…
}
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) ==…
+ if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &bcast, sizeof bcast) =…
eprintf("setsockopt:");
strlcpy(ifreq.ifr_name, ifname, IF_NAMESIZE);
ioctl(sock, SIOCGIFINDEX, &ifreq);
- if(setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof ifreq)…
+ if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof ifreq…
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_da…
- 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 transactio…
read(rnd, xid, sizeof xid);
close(rnd);
starttime = time(NULL);
run();
- return EXIT_SUCCESS;
+
+ return 0;
}
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);
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.