summaryrefslogtreecommitdiffstats
path: root/sbin/dhclient
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2020-12-01 14:55:40 +0000
committerkrw <krw@openbsd.org>2020-12-01 14:55:40 +0000
commit0354dba97f3b8436423eda5414a88043208743b2 (patch)
treed15eb7188d60a7faee4efb449df76348ce03560f /sbin/dhclient
parentTurn uvm_pagealloc() mp-safe by checking uvmexp global with pageqlock held. (diff)
downloadwireguard-openbsd-0354dba97f3b8436423eda5414a88043208743b2.tar.xz
wireguard-openbsd-0354dba97f3b8436423eda5414a88043208743b2.zip
Extract another couple of chunks from main() into helper functions,
get_routefd() and set_user().
Diffstat (limited to 'sbin/dhclient')
-rw-r--r--sbin/dhclient/dhclient.c84
1 files changed, 51 insertions, 33 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index 05760697a75..3238da5a7b2 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dhclient.c,v 1.687 2020/11/27 14:52:36 krw Exp $ */
+/* $OpenBSD: dhclient.c,v 1.688 2020/12/01 14:55:40 krw Exp $ */
/*
* Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -118,8 +118,10 @@ void get_name(struct interface_info *, int, char *);
void get_address(struct interface_info *);
void get_ssid(struct interface_info *, int);
void get_sockets(struct interface_info *);
+int get_routefd(int);
void set_autoconf(struct interface_info *, int);
void set_iff_up(struct interface_info *, int);
+void set_user(char *);
int get_ifa_family(char *, int);
struct ifaddrs *get_link_ifa(const char *, struct ifaddrs *);
void interface_state(struct interface_info *);
@@ -413,6 +415,29 @@ set_iff_up(struct interface_info *ifi, int ioctlfd)
}
void
+set_user(char *user)
+{
+ struct passwd *pw;
+
+ pw = getpwnam(user);
+ if (pw == NULL)
+ fatalx("no such user: %s", user);
+
+ if (chroot(pw->pw_dir) == -1)
+ fatal("chroot(%s)", pw->pw_dir);
+ if (chdir("/") == -1)
+ fatal("chdir(\"/\")");
+ if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) == -1)
+ fatal("setresgid");
+ if (setgroups(1, &pw->pw_gid) == -1)
+ fatal("setgroups");
+ if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) == -1)
+ fatal("setresuid");
+
+ endpwent();
+}
+
+void
get_sockets(struct interface_info *ifi)
{
unsigned char *newp;
@@ -430,6 +455,28 @@ get_sockets(struct interface_info *ifi)
}
}
+int
+get_routefd(int rdomain)
+{
+ int routefd, rtfilter;
+
+ if ((routefd = socket(AF_ROUTE, SOCK_RAW, AF_INET)) == -1)
+ fatal("socket(AF_ROUTE, SOCK_RAW)");
+
+ rtfilter = ROUTE_FILTER(RTM_PROPOSAL) | ROUTE_FILTER(RTM_IFINFO) |
+ ROUTE_FILTER(RTM_NEWADDR) | ROUTE_FILTER(RTM_DELADDR) |
+ ROUTE_FILTER(RTM_IFANNOUNCE) | ROUTE_FILTER(RTM_80211INFO);
+
+ if (setsockopt(routefd, AF_ROUTE, ROUTE_MSGFILTER,
+ &rtfilter, sizeof(rtfilter)) == -1)
+ fatal("setsockopt(ROUTE_MSGFILTER)");
+ if (setsockopt(routefd, AF_ROUTE, ROUTE_TABLEFILTER, &rdomain,
+ sizeof(rdomain)) == -1)
+ fatal("setsockopt(ROUTE_TABLEFILTER)");
+
+ return routefd;
+}
+
void
routefd_handler(struct interface_info *ifi, int routefd)
{
@@ -578,10 +625,9 @@ main(int argc, char *argv[])
{
struct stat sb;
struct interface_info *ifi;
- struct passwd *pw;
char *ignore_list = NULL;
int fd, socket_fd[2];
- int rtfilter, routefd;
+ int routefd;
int ch;
if (isatty(STDERR_FILENO) != 0)
@@ -684,26 +730,10 @@ main(int argc, char *argv[])
if ((cmd_opts & OPT_NOACTION) != 0)
return 0;
- if ((pw = getpwnam("_dhcp")) == NULL)
- fatalx("no such user: _dhcp");
-
if (asprintf(&path_lease_db, "%s.%s", _PATH_LEASE_DB, ifi->name) == -1)
fatal("path_lease_db");
- if ((routefd = socket(AF_ROUTE, SOCK_RAW, AF_INET)) == -1)
- fatal("socket(AF_ROUTE, SOCK_RAW)");
-
- rtfilter = ROUTE_FILTER(RTM_PROPOSAL) | ROUTE_FILTER(RTM_IFINFO) |
- ROUTE_FILTER(RTM_NEWADDR) | ROUTE_FILTER(RTM_DELADDR) |
- ROUTE_FILTER(RTM_IFANNOUNCE) | ROUTE_FILTER(RTM_80211INFO);
-
- if (setsockopt(routefd, AF_ROUTE, ROUTE_MSGFILTER,
- &rtfilter, sizeof(rtfilter)) == -1)
- fatal("setsockopt(ROUTE_MSGFILTER)");
- if (setsockopt(routefd, AF_ROUTE, ROUTE_TABLEFILTER, &ifi->rdomain,
- sizeof(ifi->rdomain)) == -1)
- fatal("setsockopt(ROUTE_TABLEFILTER)");
-
+ routefd = get_routefd(ifi->rdomain);
fd = take_charge(ifi, routefd, path_lease_db);
if (fd != -1)
read_lease_db(&ifi->lease_db);
@@ -712,19 +742,7 @@ main(int argc, char *argv[])
log_warn("%s: fopen(%s)", log_procname, path_lease_db);
write_lease_db(&ifi->lease_db);
- if (chroot(pw->pw_dir) == -1)
- fatal("chroot(%s)", pw->pw_dir);
- if (chdir("/") == -1)
- fatal("chdir(\"/\")");
-
- if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) == -1)
- fatal("setresgid");
- if (setgroups(1, &pw->pw_gid) == -1)
- fatal("setgroups");
- if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) == -1)
- fatal("setresuid");
-
- endpwent();
+ set_user("_dhcp");
if ((cmd_opts & OPT_FOREGROUND) == 0) {
if (pledge("stdio inet dns route proc", NULL) == -1)