Introduction
Introduction Statistics Contact Development Disclaimer Help
cleanup (WIP) - sdhcp - simple dhcp client
git clone git://git.codemadness.org/sdhcp
Log
Files
Refs
LICENSE
---
commit 3e2bf1a43fc43b90a8d1bc2ffae62b83b765cb84
parent 45c39c4a1772a01d0d37a26f2a92e3fa2f5a750e
Author: Hiltjo Posthuma <[email protected]>
Date: Fri, 25 Apr 2014 19:26:40 +0200
cleanup (WIP)
- code style, trailing whitespace and use tabs
- add some notes for further cleanup
- remove dbgprintf() code in sdhcp.c
- make exit(n), EXIT_SUCCESS or EXIT_FAILURE
Signed-off-by: Hiltjo Posthuma <[email protected]>
Diffstat:
M sdhcp.c | 412 +++++++++++++++++------------…
1 file changed, 220 insertions(+), 192 deletions(-)
---
diff --git a/sdhcp.c b/sdhcp.c
@@ -1,97 +1,99 @@
-#include<sys/socket.h>
-#include<sys/ioctl.h>
-#include<netinet/in.h>
-#include<net/if.h>
-#include<net/route.h>
-#include<signal.h>
-#include<poll.h>
-#include<errno.h>
-#include<fcntl.h>
-#include<stdio.h>
-#include<stdlib.h>
-#include<string.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <net/if.h>
+#include <net/route.h>
+#include <signal.h>
+#include <poll.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#define MIN(a,b) (((a)<(b))?(a):(b))
-typedef unsigned char uchar;
-typedef struct Bootp Bootp;
-struct Bootp {
- uchar op [1];
- uchar htype [1];
- uchar hlen [1];
- uchar hops [1];
- uchar xid [4];
- uchar secs [2];
- uchar flags [2];
- uchar ciaddr [4];
- uchar yiaddr [4];
- uchar siaddr [4];
- uchar giaddr [4];
- uchar chaddr [16];
- uchar sname [64];
- uchar file [128];
- uchar magic [4];
- uchar optdata [312-4];
-};
-void bpdump(uchar *p, int n);
-enum {
- DHCPdiscover = 1, DHCPoffer, DHCPrequest,
- DHCPdecline, DHCPack, DHCPnak, DHCPrelease,
- DHCPinform, Timeout=200,
+typedef struct bootp {
+ unsigned char op [1];
+ unsigned char htype [1];
+ unsigned char hlen [1];
+ unsigned char hops [1];
+ unsigned char xid [4];
+ unsigned char secs [2];
+ unsigned char flags [2];
+ unsigned char ciaddr [4];
+ unsigned char yiaddr [4];
+ unsigned char siaddr [4];
+ unsigned char giaddr [4];
+ unsigned char chaddr [16];
+ unsigned char sname [64];
+ unsigned char file [128];
+ unsigned char magic [4];
+ unsigned char optdata [312-4];
+} Bootp;
+
+enum {
+ DHCPdiscover = 1,
+ DHCPoffer,
+ DHCPrequest,
+ DHCPdecline,
+ DHCPack,
+ DHCPnak,
+ DHCPrelease,
+ DHCPinform,
+ Timeout = 200,
- Bootrequest= 1,
- Bootreply= 2,
+ Bootrequest = 1,
+ Bootreply = 2,
/* bootp flags */
- Fbroadcast= 1<<15,
-
- OBpad= 0,
- OBmask= 1,
- OBrouter= 3,
- OBnameserver= 5,
- OBdnsserver= 6,
- OBbaddr= 28,
- ODipaddr= 50, /* 0x32 */
- ODlease= 51,
- ODoverload= 52,
- ODtype= 53, /* 0x35 */
- ODserverid= 54, /* 0x36 */
- ODparams= 55, /* 0x37 */
- ODmessage= 56,
- ODmaxmsg= 57,
- ODrenewaltime= 58,
- ODrebindingtime= 59,
- ODvendorclass= 60,
- ODclientid= 61, /* 0x3d */
- ODtftpserver= 66,
- ODbootfile= 67,
- OBend= 255,
+ Fbroadcast = 1<<15,
+
+ OBpad = 0,
+ OBmask = 1,
+ OBrouter = 3,
+ OBnameserver = 5,
+ OBdnsserver = 6,
+ OBbaddr = 28,
+ ODipaddr = 50, /* 0x32 */
+ ODlease = 51,
+ ODoverload = 52,
+ ODtype = 53, /* 0x35 */
+ ODserverid = 54, /* 0x36 */
+ ODparams = 55, /* 0x37 */
+ ODmessage = 56,
+ ODmaxmsg = 57,
+ ODrenewaltime = 58,
+ ODrebindingtime = 59,
+ ODvendorclass = 60,
+ ODclientid = 61, /* 0x3d */
+ ODtftpserver = 66,
+ ODbootfile = 67,
+ OBend = 255,
};
-enum{ Broadcast, Unicast};
+enum { Broadcast, Unicast};
Bootp bp;
-uchar magic[] = {99, 130, 83, 99};
-
-//struct conf{
- uchar xid[sizeof bp.xid];
- uchar hwaddr[16];
- time_t starttime;
- char *ifname = "eth0";
- char *cid = "vaio.12340";
- int sock;
-//} var;
-//struct sav{
- uchar server[4];
- uchar client[4];
- uchar mask[4];
- uchar router[4];
- uchar dns[4];
- unsigned long t1;
- unsigned long t2;
-//} sav;
-
-#define IP(...) (uchar[4]){__VA_ARGS__}
+unsigned char magic[] = {99, 130, 83, 99};
+
+/* conf */
+unsigned char xid[sizeof bp.xid];
+unsigned char hwaddr[16];
+time_t starttime;
+char *ifname = "eth0";
+char *cid = "vaio.12340";
+int sock;
+/* sav */
+unsigned char server[4];
+unsigned char client[4];
+unsigned char mask[4];
+unsigned char router[4];
+unsigned char dns[4];
+unsigned long t1;
+unsigned long t2;
+
+#define IP(...) (unsigned char[4]){__VA_ARGS__}
static void
die(char *str)
@@ -101,25 +103,27 @@ die(char *str)
}
static void
-hnput(uchar *dst, unsigned long long src, int n)
+hnput(unsigned char *dst, unsigned long long src, int n)
{
- int x;
- for(x=0; n--; x++)
- dst[x] = (src>>(n*8))&0xff;
+ int i;
+
+ for(i = 0; n--; i++) /* TODO: --n ? */
+ dst[i] = (src >> (n * 8)) & 0xff;
}
static struct sockaddr
-iptoaddr(uchar ip[4], int port)
+iptoaddr(unsigned char ip[4], int port)
{
struct sockaddr_in ifaddr;
- ifaddr.sin_family=AF_INET;
+
+ ifaddr.sin_family = AF_INET;
ifaddr.sin_port = htons(port);
memcpy(&ifaddr.sin_addr, ip, sizeof ifaddr.sin_addr);
return *(struct sockaddr*)&ifaddr;
}
#define UDPWRAPPER(name, func, port, hack) \
-static int name(uchar ip[4], int fd, void *data, size_t n){\
+static int name(unsigned char ip[4], int fd, void *data, size_t n){\
struct sockaddr addr = iptoaddr(ip, port);\
int x, y = sizeof addr;\
if((x=func(fd, data, n, 0, &addr, hack y))==-1)\
@@ -130,19 +134,19 @@ UDPWRAPPER(udpsend, sendto, 67, )
UDPWRAPPER(udprecv, recvfrom, 68, &)
static void
-setip(uchar ip[4], uchar mask[4], uchar gateway[4])
+setip(unsigned char ip[4], unsigned char mask[4], unsigned char gateway[4])
{
int fd, x;
struct ifreq ifreq = {0,};
struct rtentry rtreq = {0,};
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
- strcpy(ifreq.ifr_name, ifname);
+ strcpy(ifreq.ifr_name, ifname); /*TODO: strlcpy */
ifreq.ifr_addr = iptoaddr(ip, 0);
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;
+ ifreq.ifr_flags = IFF_UP|IFF_RUNNING|IFF_BROADCAST|IFF_MULTICAST;
ioctl(fd, SIOCSIFFLAGS , &ifreq);
rtreq.rt_flags = (RTF_UP | RTF_GATEWAY);
@@ -153,93 +157,106 @@ setip(uchar ip[4], uchar mask[4], uchar gateway[4])
close(fd);
}
-static void
+
+static void
cat(int dfd, char *src)
{
- char buf[4096];
+ char buf[4096]; /* TODO: use BUFSIZ ? */
int n, sfd = open(src, O_RDONLY);
- while((n=read(sfd, buf, sizeof buf))>0)
+
+ while((n = read(sfd, buf, sizeof buf))>0)
write(dfd, buf, n);
close(sfd);
}
-//use itoa not sprintf to make dietlibc happy.
-char* itoa(char * str, int x)
+
+/* use itoa not sprintf to make dietlibc happy. */
+/* TODO: use snprintf(), fuck dietlibc */
+char *
+itoa(char * str, int x)
{
- if(x==0){
+ int k = 1;
+ char *ep = str;
+
+ if(x == 0) {
*str='0';
return str+1;
}
- int k = 1;
- char *ep = str;
- while(x/k > 0)
- k*=10;
- while((k/=10)>=1)
- *ep++ = '0'+((x/k)%10);
- *ep = '\0';
- return str+strlen(str);
+ while(x / k > 0)
+ k *= 10;
+ while((k /= 10) >= 1)
+ *ep++ = '0' + ((x / k) % 10);
+ *ep = '\0';
+ return str + strlen(str);
}
+
static void
-setdns(uchar dns[4])
+setdns(unsigned char dns[4])
{
char buf[128], *bp = buf;
int fd = creat("/etc/resolv.conf", 0644);
+
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 = 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));
cat(fd, "/etc/resolv.conf.tail");
close(fd);
}
-static uchar *
+static unsigned char *
optget(Bootp *bp, void *data, int opt, int n)
{
- uchar *p = bp->optdata;
- uchar *top = ((uchar*)bp)+sizeof *bp;
- while(p<top){
- int code = *p++;
- if(code==OBpad)
+ unsigned char *p = bp->optdata;
+ unsigned char *top = ((unsigned char *)bp) + sizeof *bp;
+ int code;
+ int len;
+
+ while(p < top) {
+ code = *p++;
+ if(code == OBpad)
continue;
- if(code==OBend || p==top)
+ if(code == OBend || p == top)
break;
- int len = *p++;
+ len = *p++;
if(len > top-p)
break;
- if(code==opt){
+ if(code == opt) {
memcpy(data, p, MIN(len, n));
return p;
}
- p+=len;
+ p += len;
}
}
-static uchar *
-optput(uchar *p, int opt, uchar *data, int len)
+static unsigned char *
+optput(unsigned char *p, int opt, unsigned char *data, int len)
{
*p++ = opt;
- *p++ = (uchar)len;
+ *p++ = (unsigned char)len;
memcpy(p, data, len);
- return p+len;
+ return p + len;
}
-static uchar*
-hnoptput(uchar *p, int opt, long long data, int len)
+
+static unsigned char *
+hnoptput(unsigned char *p, int opt, long long data, int len)
{
- *p++=opt;
- *p++ = (uchar)len;
+ *p++ = opt;
+ *p++ = (unsigned char)len;
hnput(p, data, len);
return p+len;
}
-#include "debug.c"
static void
dhcpsend(int type, int how)
{
- dbgprintf("\nSending ");
+ unsigned char *ip;
+ unsigned char *p;
+
memset(&bp, 0, sizeof bp);
hnput(bp.op, Bootrequest, 1);
hnput(bp.htype, 1, 1);
@@ -249,15 +266,15 @@ dhcpsend(int type, int how)
hnput(bp.secs, time(NULL)-starttime, sizeof bp.secs);
memcpy(bp.magic, magic, sizeof bp.magic);
memcpy(bp.chaddr, hwaddr, sizeof bp.chaddr);
- uchar *p = bp.optdata;
+ p = bp.optdata;
p = hnoptput(p, ODtype, type, 1);
p = optput(p, ODclientid, cid, strlen(cid));
- switch(type){
+ switch(type) {
case DHCPdiscover:
break;
case DHCPrequest:
-// memcpy(bp.ciaddr, client, sizeof bp.ciaddr);
+ /* memcpy(bp.ciaddr, client, sizeof bp.ciaddr); */
p = hnoptput(p, ODlease, t1, sizeof t1);
p = optput(p, ODipaddr, client, sizeof client);
p = optput(p, ODserverid, server, sizeof server);
@@ -268,33 +285,37 @@ dhcpsend(int type, int how)
p = optput(p, ODserverid, server, sizeof server);
break;
}
- *p++=OBend;
- bpdump((void*)&bp, p-(uchar*)&bp);
- uchar *ip = (how==Broadcast)?IP(255,255,255,255):server;
- udpsend(ip, sock, &bp, p-(uchar*)&bp);
+ *p++ = OBend;
+ /* debug */
+ /*bpdump((void*)&bp, p - (unsigned char *)&bp);*/
+
+ ip = (how == Broadcast) ? IP(255,255,255,255) : server;
+ udpsend(ip, sock, &bp, p - (unsigned char *)&bp);
}
static int
-dhcprecv()
+dhcprecv(void)
{
- dbgprintf("\nReceiving ");
+ unsigned char type;
+ int x;
+
memset(&bp, 0, sizeof bp);
- struct pollfd pfd = {sock, POLLIN};
- if(poll(&pfd, 1, -1)==-1){
- if(errno!=EINTR)
+ struct pollfd pfd = {sock, POLLIN}; /* TODO: not inline */
+ if(poll(&pfd, 1, -1) == -1) {
+ if(errno != EINTR)
die("poll");
else
return Timeout;
}
- int x = udprecv(IP(255,255,255,255), sock, &bp, sizeof bp);
- bpdump((void*)&bp, x);
- uchar type;
+ x = udprecv(IP(255,255,255,255), sock, &bp, sizeof bp);
+ /* debug */
+ /* bpdump((void*)&bp, x);*/
optget(&bp, &type, ODtype, sizeof type);
return type;
}
static void
-acceptlease()
+acceptlease(void)
{
setip(client, mask, router);
setdns(dns);
@@ -302,37 +323,35 @@ acceptlease()
}
static void
-run()
+run(void)
{
#if 0
InitReboot:
- //send DHCPrequest to old server
+ /* send DHCPrequest to old server */
dhcpsend(DHCPrequest, Broadcasr);
goto Rebooting;
Rebooting:
- switch (dhcprecv()){
+ switch (dhcprecv()) {
case DHCPnak:
goto Init;
case DHCPack:
acceptoffer();
- goto Bound;
+ goto Bound;
}
#endif
Init:
- dbgprintf("\n\n------- Init ------\n");
dhcpsend(DHCPdiscover, Broadcast);
alarm(1);
goto Selecting;
Selecting:
- dbgprintf("\n\n------- Selecting ------\n");
- switch(dhcprecv()){
+ 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, 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);
@@ -343,49 +362,47 @@ Selecting:
goto Selecting;
}
Requesting:
- dbgprintf("\n\n------- Requesting ------\n");
- switch(dhcprecv()){
+ switch(dhcprecv()) {
case DHCPoffer:
- goto Requesting; //ignore other offers.
-// case DHCPack: //(and you don't want it)?
-// dhcpsend(DHCPdecline, Unicast);
-// goto Init;
+ 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:
- dbgprintf("\n\n------- Bound ------\n");
- write(1, "Congrats! You should be on the 'net.\n", 37);
+ fputs("Congrats! You should be on the 'net.\n", stdout);
if(fork())
- exit(0);
- switch (dhcprecv()){
+ exit(EXIT_SUCCESS);
+ switch (dhcprecv()) {
case DHCPoffer:
case DHCPack:
case DHCPnak:
- goto Bound; //discard offer, ack, or nak
+ goto Bound; /* discard offer, ack, or nak */
case Timeout:
dhcpsend(DHCPrequest, Unicast);
- goto Renewing;
+ goto Renewing;
}
Renewing:
- dbgprintf("\n\n------- Renewing ------\n");
- switch(dhcprecv()){
+ switch(dhcprecv()) {
case DHCPack:
acceptlease();
goto Bound;
case DHCPnak:
- //halt network;
+ /* halt network; */
goto Init;
- case Timeout: //t2 expires:
+ case Timeout: /* t2 expires: */
dhcpsend(DHCPrequest, Broadcast);
goto Rebinding;
}
Rebinding:
- dbgprintf("\n\n------- Rebinding ------\n");
- switch(dhcprecv()){
- case DHCPnak: //lease expired
- //halt network;
+ switch(dhcprecv()) {
+ case DHCPnak: /* lease expired */
+ /* halt network; */
goto Init;
case DHCPack:
acceptlease();
@@ -393,19 +410,31 @@ Rebinding:
}
}
-static void nop(int unused){ }
-static void cleanexit(int unused){
+static void nop(int unused) {
+}
+
+static void cleanexit(int unused) {
dhcpsend(DHCPrelease, Unicast);
- exit(0);
+ exit(EXIT_SUCCESS);
+}
+
+static void
+usage(void) {
fputs("usage: sdhcp [interface]\n", stderr);
+ exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
- if(argc>2){
- exit(EXIT_FAILURE);
- }if(argc==2)
+ int bcast = 1;
+ struct ifreq ifreq = {0,};
+ struct sockaddr addr;
+ int rnd;
+
+ if(argc > 2)
+ usage();
+ else if(argc == 2)
ifname = argv[1];
signal(SIGALRM, nop);
@@ -413,24 +442,23 @@ main(int argc, char *argv[])
if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
die("socket");
- int bcast = 1;
if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &bcast, sizeof bcast)==-…
die("setsockopt");
- struct ifreq ifreq = {0,};
- strcpy(ifreq.ifr_name, ifname);
+
+ strcpy(ifreq.ifr_name, ifname); /* TODO: strlcpy */
ioctl(sock, SIOCGIFINDEX, &ifreq);
if(setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof ifreq)…
die("setsockopt");
- struct sockaddr addr = iptoaddr(IP(255,255,255,255), 68);
+ addr = iptoaddr(IP(255,255,255,255), 68);
if(bind(sock, (void*)&addr, sizeof addr)!=0)
die("bind");
ioctl(sock, SIOCGIFHWADDR, &ifreq);
memcpy(hwaddr, ifreq.ifr_hwaddr.sa_data, sizeof ifreq.ifr_hwaddr.sa_da…
- int rnd = open("/dev/urandom", O_RDONLY);
+ rnd = open("/dev/urandom", O_RDONLY);
read(rnd, xid, sizeof xid);
close(rnd);
- starttime = time(NULL);
+ starttime = time(NULL);
run();
- return 0;
+ return EXIT_SUCCESS;
}
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.