diff --git a/core/sdhcp.d/Makefile b/core/sdhcp.d/Makefile new file mode 100644 index 0000000..cfba0a3 --- /dev/null +++ b/core/sdhcp.d/Makefile @@ -0,0 +1,44 @@ + +package=sdhcp +version=8455fd2d090bd9b227340c30c92c6aa13302c91a +pkgver=${version}_0 +description=Suckless dhcp client +homepage=http://git.2f30.org/sdhcp +license=MIT/X Consortium License + +alternatives= +shlib-provides= +shlib-requires=libc.so + +include ../../Makefile + +SOURCES = \ + ${package} + +FILES = \ + files/Makefile \ + files/setip.c + +${package}: + export url=git://git.2f30.org pkg=$@ commit=${version} && ${GITCLONE} + ${SHA256D} "c9c990f5469d5e0b819fe5c59e05b36d7d21e8594f33b0cf71486c9926e2eb5d" + +prepare: ${SOURCES} + mv ${package} build + mv -f files/Makefile build/ + mv files/setip.c build/ + +root: + sed "s/VERSION/$(VERSION)/g" sdhcp.1 > _ + mv _ sdhcp.1 + + sed '/setenv("DNS", buf, 1);/asetenv("IFNAME", ifname, 1);' sdhcp.c > _ + mv _ sdhcp.c + + ${MAKE} + install -Dm 755 sdhcp "${root}/usr/bin/sdhcp" + install -Dm 644 sdhcp.1 "${root}/usr/share/man/man1/sdhcp.1" + + ${MAKE} setip + install -Dm 755 setip "${root}/usr/libexec/sdhcp/setip" + diff --git a/core/sdhcp.d/files/Makefile b/core/sdhcp.d/files/Makefile new file mode 100644 index 0000000..0406c4e --- /dev/null +++ b/core/sdhcp.d/files/Makefile @@ -0,0 +1,60 @@ +include config.mk + +.POSIX: +.SUFFIXES: .c .o + +HDR = util.h arg.h +LIB = \ + util/strlcpy.o \ + util/eprintf.o + +BIN = sdhcp + +OBJ = $(BIN).o $(LIB) +MAN = $(BIN).1 + +all: options $(BIN) + +options: + @echo sdhcp build options: + @echo "CFLAGS = ${CFLAGS}" + @echo "LDFLAGS = ${LDFLAGS}" + @echo "CC = ${CC}" + +$(BIN): $(BIN).o + +$(OBJ): $(HDR) config.mk + +.o: util.a + @echo LD $@ + @$(LD) -o $@ $< util.a $(LDFLAGS) + +.c.o: + @echo CC $< + @$(CC) -c -o $@ $< $(CFLAGS) + +util.a: $(LIB) + @echo AR $@ + @$(AR) -r -c $@ $(LIB) + +install: all + @echo installing executables to $(DESTDIR)$(PREFIX)/sbin + @mkdir -p $(DESTDIR)$(PREFIX)/sbin + @cp -f $(BIN) $(DESTDIR)$(PREFIX)/sbin + @cd $(DESTDIR)$(PREFIX)/sbin && chmod 755 $(BIN) + @echo installing manual pages to $(DESTDIR)$(MANPREFIX)/man1 + @mkdir -p $(DESTDIR)$(MANPREFIX)/man1 + @for m in $(MAN); do sed "s/VERSION/$(VERSION)/g" < "$$m" > $(DESTDIR)$(MANPREFIX)/man1/"$$m"; done + @cd $(DESTDIR)$(MANPREFIX)/man1 && chmod 644 $(MAN) + +uninstall: + @echo removing executables from $(DESTDIR)$(PREFIX)/sbin + @cd $(DESTDIR)$(PREFIX)/sbin && rm -f $(BIN) + @echo removing manual pages from $(DESTDIR)$(MANPREFIX)/man1 + @cd $(DESTDIR)$(MANPREFIX)/man1 && rm -f $(MAN) + +clean: + @echo cleaning + @rm -f $(BIN) $(OBJ) util.a + +.PHONY: all options clean install uninstall diff --git a/core/sdhcp.d/files/setip.c b/core/sdhcp.d/files/setip.c new file mode 100644 index 0000000..474db0f --- /dev/null +++ b/core/sdhcp.d/files/setip.c @@ -0,0 +1,62 @@ +#include +#include + +#include +#include +#include +#include +#include + +int main( void ) +{ + struct sockaddr_in * addr; + char *ifname = getenv( "IFNAME" ), + *client = getenv( "CLIENT" ), + *getway = getenv( "ROUTER" ), + *mask = getenv( "MASK" ); + + int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + + // IP + { + struct ifreq iface; + iface.ifr_addr.sa_family = AF_INET; + strcpy( iface.ifr_name, ifname ); + + addr = &iface.ifr_addr; + + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = inet_addr(client); + ioctl(fd, SIOCSIFADDR, &iface); + + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = inet_addr(mask); + ioctl(fd, SIOCSIFNETMASK, &iface); + + iface.ifr_flags |= ( IFF_UP | IFF_RUNNING ); + ioctl(fd, SIOCSIFFLAGS, &iface); + } + + // ROUTE + { + struct rtentry route; + + addr = &route.rt_dst; + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = INADDR_ANY; + + addr = &route.rt_gateway; + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = inet_addr(getway); + + addr = &route.rt_genmask; + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = INADDR_ANY; + + route.rt_flags = RTF_UP | RTF_GATEWAY ; + ioctl(fd, SIOCADDRT, &route); + } + + close(fd); + return 0; +}