sdhcp

simple dhcp client
git clone git://git.2f30.org/sdhcp
Log | Files | Refs | LICENSE

commit 2f36192032083fac6ee0200f3b32f5253ac6c221
parent 4f0cb77b97c5b7e907cd5b1e926a1d992f566995
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date:   Sat, 26 Apr 2014 00:18:33 +0200

args: simplify a bit

- change -i to toggle to set ip (default none).
- add -e to launch program $CLIENT, $DNS, $ROUTER and $MASK are set.

Signed-off-by: Hiltjo Posthuma <hiltjo@codemadness.org>

Diffstat:
Msdhcp.c | 31+++++++++++++++++++++++--------
1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/sdhcp.c b/sdhcp.c @@ -85,6 +85,7 @@ static unsigned char hwaddr[16]; static time_t starttime; static char *ifname = "eth0"; static char *cid = ""; +static char *program = ""; static int sock; /* sav */ static unsigned char server[4]; @@ -95,6 +96,7 @@ static unsigned char dns[4]; static unsigned long t1; static int dflag = 0; /* set DNS: change /etc/resolv.conf ? */ +static int iflag = 0; #define IP(a,b,c,d) (unsigned char[4]){a,b,c,d} @@ -312,9 +314,22 @@ dhcprecv(void) static void acceptlease(void) { - setip(client, mask, router); + char buf[128]; + if(iflag) + setip(client, mask, router); if(dflag == 1) setdns(dns); + if(*program) { + snprintf(buf, sizeof(buf), "%d.%d.%d.%d", client[0], client[1], client[2], client[3]); + setenv("CLIENT", buf, 1); + snprintf(buf, sizeof(buf), "%d.%d.%d.%d", mask[0], mask[1], mask[2], mask[3]); + setenv("MASK", buf, 1); + snprintf(buf, sizeof(buf), "%d.%d.%d.%d", router[0], router[1], router[2], router[3]); + setenv("ROUTER", buf, 1); + snprintf(buf, sizeof(buf), "%d.%d.%d.%d", dns[0], dns[1], dns[2], dns[3]); + setenv("DNS", buf, 1); + system(program); + } alarm(t1); } @@ -414,7 +429,7 @@ static void cleanexit(int unused) { static void usage(void) { - eprintf("usage: sdhcp [ifname] | [[-i] <ifname>] [-d] [-c <clientid>]\n"); + eprintf("usage: sdhcp [-i] [-d] [-e program] [ifname] [clientid]\n"); } int @@ -426,11 +441,11 @@ main(int argc, char *argv[]) int rnd; ARGBEGIN { - case 'c': /* client-id */ - cid = EARGF(usage()); + case 'e': /* run program */ + program = EARGF(usage()); break; - case 'i': /* interface */ - ifname = EARGF(usage()); + case 'i': /* set ip */ + iflag = 1; break; case 'd': /* DNS: update /etc/resolv.conf */ dflag = 1; @@ -441,9 +456,9 @@ main(int argc, char *argv[]) } ARGEND; if(argc >= 1) - ifname = argv[0]; + ifname = argv[0]; /* interface name */ if(argc >= 2) - cid = argv[1]; + cid = argv[1]; /* client-id */ memset(&ifreq, 0, sizeof(ifreq)); signal(SIGALRM, nop);