simple dhcp client
git clone git://
Log | Files | Refs | LICENSE

commit 90b18e7b1cfcf7ab0799b917d7c4d1318ed29f57
parent 450beea4e88ab7f80206741f18f0d5539ae60b44
Author: Michael Forney <>
Date:   Thu Feb  9 13:42:27 -0800

Fix sent lease time on 64-bit systems

The lease time option is defined in RFC 1533 to be a 32-bit unsigned
integer. However, on 64-bit systems, unsigned long long is 64 bits, so
hnput writes 8 bytes, the first 4 of which are 0.

dnsmasq (and possibly other DHCP servers) only looks at the first 4
bytes in the option, so interprets a lease time of 0. It then sets the
lease time to a minimum of 120 seconds. This causes the server to expire
the lease long before sdhcp attempts to renew it.

sdhcp.c | 7++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/sdhcp.c b/sdhcp.c @@ -9,6 +9,7 @@ #include <fcntl.h> #include <poll.h> #include <signal.h> +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -95,7 +96,7 @@ static unsigned char client[4]; static unsigned char mask[4]; static unsigned char router[4]; static unsigned char dns[4]; -static unsigned long t1; +static uint32_t t1; static int dflag = 1; /* change DNS in /etc/resolv.conf ? */ static int iflag = 1; /* set IP ? */ @@ -104,7 +105,7 @@ static int fflag = 0; /* run in foreground */ #define IP(a,b,c,d) (unsigned char[4]){a,b,c,d} static void -hnput(unsigned char *dst, unsigned long long src, size_t n) +hnput(unsigned char *dst, uint32_t src, size_t n) { unsigned int i; @@ -249,7 +250,7 @@ optput(unsigned char *p, int opt, unsigned char *data, size_t len) } static unsigned char * -hnoptput(unsigned char *p, int opt, long long data, size_t len) +hnoptput(unsigned char *p, int opt, uint32_t data, size_t len) { *p++ = opt; *p++ = (unsigned char)len;