netd: get dns server from dhcp

This commit is contained in:
Matheus
2024-04-09 20:46:51 -03:00
parent 6d3fa3463e
commit ee3e9a9da9
+34 -2
View File
@@ -13,6 +13,8 @@
#include <errno.h> #include <errno.h>
#include <poll.h> #include <poll.h>
#include <net/route.h> #include <net/route.h>
#include <fcntl.h>
#include <unistd.h>
#ifndef SIOCADDRT #ifndef SIOCADDRT
#define SIOCADDRT 0x890B #define SIOCADDRT 0x890B
@@ -57,10 +59,11 @@ typedef struct {
#define OPTION_TYPE_DHCPACK 5 #define OPTION_TYPE_DHCPACK 5
#define OPTION_REQUEST 55 #define OPTION_REQUEST 55
#define OPTION_REQUEST_LENGTH 2 #define OPTION_REQUEST_LENGTH 3
#define OPTION_MASK 1 #define OPTION_MASK 1
#define OPTION_ROUTER 3 #define OPTION_ROUTER 3
#define OPTION_DNS 6
#define OPTION_LEASETIME 51 #define OPTION_LEASETIME 51
#define OPTION_IPREQ 50 #define OPTION_IPREQ 50
#define OPTION_SERVER 54 #define OPTION_SERVER 54
@@ -68,7 +71,7 @@ typedef struct {
static uint8_t discoveropts[] = { static uint8_t discoveropts[] = {
OPTION_TYPE, OPTION_TYPE_LENGTH, OPTION_TYPE_DHCPDISCOVER, OPTION_TYPE, OPTION_TYPE_LENGTH, OPTION_TYPE_DHCPDISCOVER,
OPTION_REQUEST, OPTION_REQUEST_LENGTH, OPTION_MASK, OPTION_ROUTER, OPTION_REQUEST, OPTION_REQUEST_LENGTH, OPTION_MASK, OPTION_ROUTER, OPTION_DNS,
0xff 0xff
}; };
@@ -223,6 +226,7 @@ typedef struct {
uint32_t netmask; uint32_t netmask;
uint32_t router; uint32_t router;
uint32_t leasetime; uint32_t leasetime;
uint32_t dns;
} offer_t; } offer_t;
static int processoffer(offer_t *offer, uint32_t *xid) { static int processoffer(offer_t *offer, uint32_t *xid) {
@@ -271,6 +275,10 @@ static int processoffer(offer_t *offer, uint32_t *xid) {
uint32_t leasetime = optget32(opts, i + 2); uint32_t leasetime = optget32(opts, i + 2);
offer->leasetime = leasetime; offer->leasetime = leasetime;
break; break;
case OPTION_DNS:
uint32_t dns = optget32(opts, i + 2);
offer->dns = dns;
break;
case OPTION_END: case OPTION_END:
goto leave; goto leave;
} }
@@ -381,6 +389,7 @@ static void printoffer(offer_t *offer) {
printip("server ip", offer->serverip); printip("server ip", offer->serverip);
printip("netmask", offer->netmask); printip("netmask", offer->netmask);
printip("router", offer->router); printip("router", offer->router);
printip("DNS", offer->dns);
printf("%s: lease time: %d seconds\n", name, offer->leasetime); printf("%s: lease time: %d seconds\n", name, offer->leasetime);
} }
@@ -422,6 +431,28 @@ static void setifip(char *device, uint32_t addr) {
logstrerror("failed to set device ip address"); logstrerror("failed to set device ip address");
} }
static void writedns(uint32_t dns) {
char buff[100];
int fd = creat("/etc/resolv.conf", 0644);
if (fd < 0) {
perror("failed to create /etc/resolv.conf");
return;
}
struct in_addr addr;
addr.s_addr = htonl(dns);
char *ipstr = inet_ntoa(addr);
snprintf(buff, 100, "# generated by netd\nnameserver %s\n", ipstr);
if (write(fd, buff, strlen(buff)) < 0) {
perror("failed to write to /etc/resolv.conf");
return;
}
close(fd);
}
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
name = argv[0]; name = argv[0];
@@ -486,6 +517,7 @@ int main(int argc, char *argv[]) {
addroute(argv[1], 0, offer.router, 0, 1); addroute(argv[1], 0, offer.router, 0, 1);
addroute(argv[1], offer.clientip, 0, offer.netmask, 10); addroute(argv[1], offer.clientip, 0, offer.netmask, 10);
setifip(argv[1], offer.clientip); setifip(argv[1], offer.clientip);
writedns(offer.dns);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }