cleanup code - sdhcp - simple dhcp client | |
git clone git://git.codemadness.org/sdhcp | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit ff21770ca48baa7851a9e6972e33584d66c3e785 | |
parent 7780d06e8ee64392f8c852ae24cdf5ff8c11845a | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Fri, 25 Apr 2014 22:01:20 +0200 | |
cleanup code | |
Signed-off-by: Hiltjo Posthuma <[email protected]> | |
Diffstat: | |
M sdhcp.c | 97 ++++++++++-------------------… | |
1 file changed, 31 insertions(+), 66 deletions(-) | |
--- | |
diff --git a/sdhcp.c b/sdhcp.c | |
@@ -95,12 +95,6 @@ static unsigned long t1; | |
#define IP(...) (unsigned char[4]){__VA_ARGS__} | |
-static void | |
-die(char *str) | |
-{ | |
- perror(str); | |
- exit(EXIT_FAILURE); | |
-} | |
static void | |
hnput(unsigned char *dst, unsigned long long src, size_t n) | |
@@ -149,24 +143,25 @@ udprecv(unsigned char ip[4], int fd, void *data, size_t n… | |
static void | |
setip(unsigned char ip[4], unsigned char mask[4], unsigned char gateway[4]) | |
{ | |
- int fd, x; | |
- struct ifreq ifreq = {0,}; | |
- struct rtentry rtreq = {0,}; | |
+ struct ifreq ifreq = { 0, }; | |
+ struct rtentry rtreq = { 0, }; | |
+ int fd; | |
- fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); | |
strlcpy(ifreq.ifr_name, ifname, IF_NAMESIZE); | |
ifreq.ifr_addr = iptoaddr(ip, 0); | |
- ioctl(fd, SIOCSIFADDR , &ifreq); | |
+ if((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == -1) | |
+ eprintf("can't set ip, socket:"); | |
+ ioctl(fd, SIOCSIFADDR, &ifreq); | |
ifreq.ifr_netmask = iptoaddr(mask, 0); | |
- ioctl(fd, SIOCSIFNETMASK , &ifreq); | |
- ifreq.ifr_flags = IFF_UP|IFF_RUNNING|IFF_BROADCAST|IFF_MULTICAST; | |
- ioctl(fd, SIOCSIFFLAGS , &ifreq); | |
- | |
+ ioctl(fd, SIOCSIFNETMASK, &ifreq); | |
+ ifreq.ifr_flags = IFF_UP | IFF_RUNNING | IFF_BROADCAST | IFF_MULTICAST; | |
+ ioctl(fd, SIOCSIFFLAGS, &ifreq); | |
+ /* gw */ | |
rtreq.rt_flags = (RTF_UP | RTF_GATEWAY); | |
rtreq.rt_gateway = iptoaddr(gateway, 0); | |
- rtreq.rt_genmask = iptoaddr(IP(0,0,0,0), 0); | |
- rtreq.rt_dst = iptoaddr(IP(0,0,0,0), 0); | |
- ioctl(fd, SIOCADDRT , &rtreq); | |
+ rtreq.rt_genmask = iptoaddr(IP(0, 0, 0, 0), 0); | |
+ rtreq.rt_dst = iptoaddr(IP(0, 0, 0, 0), 0); | |
+ ioctl(fd, SIOCADDRT, &rtreq); | |
close(fd); | |
} | |
@@ -182,43 +177,20 @@ cat(int dfd, char *src) | |
close(sfd); | |
} | |
- | |
-/* use itoa not sprintf to make dietlibc happy. */ | |
-/* TODO: use snprintf(), fuck dietlibc */ | |
-char * | |
-itoa(char * str, int x) | |
-{ | |
- int k = 1; | |
- char *ep = str; | |
- | |
- if(x == 0) { | |
- *str='0'; | |
- return str+1; | |
- } | |
- while(x / k > 0) | |
- k *= 10; | |
- while((k /= 10) >= 1) | |
- *ep++ = '0' + ((x / k) % 10); | |
- *ep = '\0'; | |
- return str + strlen(str); | |
} | |
static void | |
setdns(unsigned char dns[4]) | |
{ | |
- char buf[128], *bp = buf; | |
+ char buf[128]; | |
int fd; | |
- if((fd = creat("/etca/resolv.conf", 0644)) == -1) | |
+ if((fd = creat("/etc/resolv.conf", 0644)) == -1) | |
weprintf("can't change /etc/resolv.conf:"); | |
cat(fd, "/etc/resolv.conf.head"); | |
- memcpy(buf, "\nnameserver ", 12), bp+=11; | |
- *(bp = itoa(bp+1, dns[0])) = '.'; | |
- *(bp = itoa(bp+1, dns[1])) = '.'; | |
- *(bp = itoa(bp+1, dns[2])) = '.'; | |
- *(bp = itoa(bp+1, dns[3])) = '\n'; | |
- *++bp = '\0'; | |
- write(fd, buf, strlen(buf)); | |
+ 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"); | |
close(fd); | |
} | |
@@ -238,18 +210,18 @@ optget(Bootp *bp, void *data, int opt, int n) | |
if(code == OBend || p == top) | |
break; | |
len = *p++; | |
- if(len > top-p) | |
+ if(len > top - p) | |
break; | |
if(code == opt) { | |
memcpy(data, p, MIN(len, n)); | |
- return p; | |
+ return; | |
} | |
p += len; | |
} | |
} | |
static unsigned char * | |
-optput(unsigned char *p, int opt, unsigned char *data, int len) | |
+optput(unsigned char *p, int opt, unsigned char *data, size_t len) | |
{ | |
*p++ = opt; | |
*p++ = (unsigned char)len; | |
@@ -258,19 +230,18 @@ optput(unsigned char *p, int opt, unsigned char *data, in… | |
} | |
static unsigned char * | |
-hnoptput(unsigned char *p, int opt, long long data, int len) | |
+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; | |
+ return p + len; | |
} | |
static void | |
dhcpsend(int type, int how) | |
{ | |
- unsigned char *ip; | |
- unsigned char *p; | |
+ unsigned char *ip, *p; | |
memset(&bp, 0, sizeof bp); | |
hnput(bp.op, Bootrequest, 1); | |
@@ -278,7 +249,7 @@ dhcpsend(int type, int how) | |
hnput(bp.hlen, 6, 1); | |
memcpy(bp.xid, xid, sizeof xid); | |
hnput(bp.flags, Fbroadcast, sizeof bp.flags); | |
- hnput(bp.secs, time(NULL)-starttime, sizeof bp.secs); | |
+ hnput(bp.secs, time(NULL) - starttime, sizeof bp.secs); | |
memcpy(bp.magic, magic, sizeof bp.magic); | |
memcpy(bp.chaddr, hwaddr, sizeof bp.chaddr); | |
p = bp.optdata; | |
@@ -301,10 +272,8 @@ dhcpsend(int type, int how) | |
break; | |
} | |
*p++ = OBend; | |
- /* debug */ | |
- /*bpdump((void*)&bp, p - (unsigned char *)&bp);*/ | |
- ip = (how == Broadcast) ? IP(255,255,255,255) : server; | |
+ ip = (how == Broadcast) ? IP(255, 255, 255, 255) : server; | |
udpsend(ip, sock, &bp, p - (unsigned char *)&bp); | |
} | |
@@ -312,19 +281,16 @@ static int | |
dhcprecv(void) | |
{ | |
unsigned char type; | |
- int x; | |
+ struct pollfd pfd = {sock, POLLIN}; | |
memset(&bp, 0, sizeof bp); | |
- struct pollfd pfd = {sock, POLLIN}; /* TODO: not inline */ | |
if(poll(&pfd, 1, -1) == -1) { | |
if(errno != EINTR) | |
- die("poll"); | |
- else | |
+ eprintf("poll:"); | |
+ else | |
return Timeout; | |
} | |
- x = udprecv(IP(255,255,255,255), sock, &bp, sizeof bp); | |
- /* debug */ | |
- /* bpdump((void*)&bp, x);*/ | |
+ udprecv(IP(255, 255, 255, 255), sock, &bp, sizeof bp); | |
optget(&bp, &type, ODtype, sizeof type); | |
return type; | |
} | |
@@ -435,8 +401,7 @@ static void cleanexit(int unused) { | |
static void | |
usage(void) { | |
- fputs("usage: sdhcp [interface]\n", stderr); | |
- exit(EXIT_FAILURE); | |
+ eprintf("usage: sdhcp [ifname] | [[-i] <ifname>] [-r] [-c <clientid>]\… | |
} | |
int |