Skip to content

Commit 60594cd

Browse files
committed
Adjust for new eloop.
Needs more testing.
1 parent c4d6af2 commit 60594cd

File tree

10 files changed

+100
-152
lines changed

10 files changed

+100
-152
lines changed

.clangd

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1+
If:
2+
PathMatch: src/dev/.*\.c
3+
CompileFlags:
4+
Add: [-I.., -I../.., -I../../compat]
5+
---
16
If:
27
PathMatch: src/.*\.c
38
CompileFlags:
4-
Add: [-I., -I.., -I../compat]
9+
Add: [-I.., -I../compat]
10+
---
11+
CompileFlags:
12+
Add: [-DINET, -DARP, -DARPING, -DIPV4LL, -DINET6, -DDHCP6, -DPLUGIN_DEV, -DAUTH, -DPRIVSEP]

configure

Lines changed: 0 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,89 +1249,6 @@ fi
12491249
# Set this for eloop
12501250
echo "#define HAVE_REALLOCARRAY" >>$CONFIG_H
12511251

1252-
# Detect a polling mechanism.
1253-
# See src/eloop.c as to why we only detect ppoll, pollts and pselect and
1254-
# not others like epoll or kqueue.
1255-
if [ -z "$POLL" ]; then
1256-
printf "Testing for ppoll ... "
1257-
cat <<EOF >_ppoll.c
1258-
#include <poll.h>
1259-
#include <stddef.h>
1260-
int main(void) {
1261-
struct pollfd fds;
1262-
return ppoll(&fds, 1, NULL, NULL);
1263-
}
1264-
EOF
1265-
if $XCC _ppoll.c -o _ppoll 2>&3; then
1266-
POLL=ppoll
1267-
echo "yes"
1268-
else
1269-
echo "no"
1270-
fi
1271-
rm -f _ppoll.c _ppoll
1272-
fi
1273-
if [ -z "$POLL" ]; then
1274-
printf "Testing for pollts ... "
1275-
cat <<EOF >_pollts.c
1276-
#include <poll.h>
1277-
#include <stddef.h>
1278-
int main(void) {
1279-
struct pollfd fds;
1280-
return pollts(&fds, 1, NULL, NULL);
1281-
}
1282-
EOF
1283-
if $XCC _pollts.c -o _pollts 2>&3; then
1284-
POLL=pollts
1285-
echo "yes"
1286-
else
1287-
echo "no"
1288-
fi
1289-
rm -f _pollts.c _pollts
1290-
fi
1291-
if [ -z "$POLL" ]; then
1292-
printf "Testing for pselect ... "
1293-
cat <<EOF >_pselect.c
1294-
#include <sys/select.h>
1295-
#include <stdlib.h>
1296-
int main(void) {
1297-
return pselect(0, NULL, NULL, NULL, NULL, NULL);
1298-
}
1299-
EOF
1300-
if $XCC _pselect.c -o _pselect 2>&3; then
1301-
POLL=pselect
1302-
echo "yes"
1303-
else
1304-
echo "no"
1305-
fi
1306-
rm -f _pselect.c _pselect
1307-
fi
1308-
case "$POLL" in
1309-
kqueue1)
1310-
echo "#define HAVE_KQUEUE" >>$CONFIG_H
1311-
echo "#define HAVE_KQUEUE1" >>$CONFIG_H
1312-
POLL=kqueue
1313-
;;
1314-
kqueue)
1315-
echo "#define HAVE_KQUEUE" >>$CONFIG_H
1316-
;;
1317-
epoll)
1318-
echo "#define HAVE_EPOLL" >>$CONFIG_H
1319-
;;
1320-
ppoll)
1321-
echo "#define HAVE_PPOLL" >>$CONFIG_H
1322-
;;
1323-
pollts)
1324-
echo "#define HAVE_POLLTS" >>$CONFIG_H
1325-
;;
1326-
pselect)
1327-
echo "#define HAVE_PSELECT" >>$CONFIG_H
1328-
;;
1329-
*)
1330-
echo "No suitable polling function is available, not even pselect" >&2
1331-
exit 1
1332-
;;
1333-
esac
1334-
13351252
if [ -z "$BE64ENC" ]; then
13361253
printf "Testing for be64enc ... "
13371254
cat <<EOF >_be64enc.c

src/dhcpcd.c

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,8 +1450,9 @@ dhcpcd_signal_cb(int sig, void *arg)
14501450
return;
14511451
}
14521452

1453-
if (sig != SIGCHLD && ctx->options & DHCPCD_FORKED) {
1454-
if (sig != SIGHUP &&
1453+
if (sig != SIGCHLD && ctx->options & DHCPCD_FORKED)
1454+
{
1455+
if (ctx->fork_fd != -1 && sig != SIGHUP &&
14551456
send(ctx->fork_fd, &sig, sizeof(sig), MSG_EOR) == -1)
14561457
logerr("%s: send", __func__);
14571458
return;
@@ -2243,7 +2244,7 @@ main(int argc, char **argv, char **envp)
22432244
eloop_signal_set_cb(ctx.eloop,
22442245
dhcpcd_signals, dhcpcd_signals_len,
22452246
dhcpcd_signal_cb, &ctx);
2246-
if (eloop_signal_mask(ctx.eloop, &ctx.sigset) == -1) {
2247+
if (eloop_signal_mask(ctx.eloop) == -1) {
22472248
logerr("%s: eloop_signal_mask", __func__);
22482249
goto exit_failure;
22492250
}
@@ -2408,6 +2409,7 @@ main(int argc, char **argv, char **envp)
24082409
logerr("socketpair");
24092410
goto exit_failure;
24102411
}
2412+
24112413
switch (pid = fork()) {
24122414
case -1:
24132415
logerr("fork");
@@ -2421,23 +2423,33 @@ main(int argc, char **argv, char **envp)
24212423
goto exit_failure;
24222424
}
24232425
#endif
2424-
if (eloop_event_add(ctx.eloop, ctx.fork_fd, ELE_READ,
2425-
dhcpcd_fork_cb, &ctx) == -1)
2426-
logerr("%s: eloop_event_add", __func__);
2427-
24282426
if (setsid() == -1) {
24292427
logerr("%s: setsid", __func__);
24302428
goto exit_failure;
24312429
}
24322430
/* Ensure we can never get a controlling terminal */
2433-
switch (pid = fork()) {
2434-
case -1:
2431+
pid = fork();
2432+
if (pid == -1) {
24352433
logerr("fork");
24362434
goto exit_failure;
2437-
case 0:
2438-
eloop_forked(ctx.eloop);
2439-
break;
2440-
default:
2435+
}
2436+
/* setsid again to ensure our child processes have the
2437+
* correct ppid */
2438+
if (pid == 0 && setsid() == -1) {
2439+
logerr("%s: setsid", __func__);
2440+
goto exit_failure;
2441+
}
2442+
if (eloop_forked(ctx.eloop, ELF_KEEP_ALL) == -1) {
2443+
logerr("%s: eloop_forked", __func__);
2444+
goto exit_failure;
2445+
}
2446+
if (eloop_event_add(ctx.eloop, ctx.fork_fd, ELE_READ,
2447+
dhcpcd_fork_cb, &ctx) == -1)
2448+
{
2449+
logerr("%s: eloop_event_add", __func__);
2450+
goto exit_failure;
2451+
}
2452+
if (pid != 0) {
24412453
ctx.options |= DHCPCD_FORKED; /* A lie */
24422454
i = EXIT_SUCCESS;
24432455
goto exit1;
@@ -2651,7 +2663,7 @@ main(int argc, char **argv, char **envp)
26512663
}
26522664

26532665
run_loop:
2654-
i = eloop_start(ctx.eloop, &ctx.sigset);
2666+
i = eloop_start(ctx.eloop);
26552667
if (i < 0) {
26562668
logerr("%s: eloop_start", __func__);
26572669
goto exit_failure;

src/dhcpcd.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,6 @@ struct dhcpcd_ctx {
156156
int seq; /* route message sequence no */
157157
int sseq; /* successful seq no sent */
158158

159-
#ifdef USE_SIGNALS
160-
sigset_t sigset;
161-
#endif
162159
struct eloop *eloop;
163160

164161
char *script;

src/privsep-bpf.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ ps_bpf_cmd(struct dhcpcd_ctx *ctx, struct ps_msghdr *psm, struct msghdr *msg)
259259
addr != NULL ? " " : "", addr != NULL ? addr : "");
260260

261261
start = ps_startprocess(psp, ps_bpf_recvmsg, NULL,
262-
ps_bpf_start_bpf, NULL, PSF_DROPPRIVS);
262+
ps_bpf_start_bpf, PSF_DROPPRIVS);
263+
263264
switch (start) {
264265
case -1:
265266
ps_freeprocess(psp);

src/privsep-control.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ ps_ctl_start(struct dhcpcd_ctx *ctx)
236236
psp = ctx->ps_ctl = ps_newprocess(ctx, &id);
237237
strlcpy(psp->psp_name, "control proxy", sizeof(psp->psp_name));
238238
pid = ps_startprocess(psp, ps_ctl_recvmsg, ps_ctl_dodispatch,
239-
ps_ctl_startcb, NULL, PSF_DROPPRIVS);
239+
ps_ctl_startcb, PSF_DROPPRIVS);
240240

241241
if (pid == -1)
242242
return -1;

src/privsep-inet.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ ps_inet_start(struct dhcpcd_ctx *ctx)
370370

371371
strlcpy(psp->psp_name, "network proxy", sizeof(psp->psp_name));
372372
pid = ps_startprocess(psp, ps_inet_recvmsg, ps_inet_dodispatch,
373-
ps_inet_startcb, NULL, PSF_DROPPRIVS);
373+
ps_inet_startcb, PSF_DROPPRIVS);
374374

375375
if (pid == 0)
376376
ps_entersandbox("stdio", NULL);
@@ -594,7 +594,7 @@ ps_inet_cmd(struct dhcpcd_ctx *ctx, struct ps_msghdr *psm, struct msghdr *msg)
594594
"%s proxy %s", psp->psp_protostr,
595595
inet_ntop(psa->psa_family, ia, buf, sizeof(buf)));
596596
start = ps_startprocess(psp, ps_inet_recvmsgpsp, NULL,
597-
start_func, NULL, PSF_DROPPRIVS);
597+
start_func, PSF_DROPPRIVS);
598598
switch (start) {
599599
case -1:
600600
ps_freeprocess(psp);

src/privsep-root.c

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ ps_root_readerrorcb(void *arg, unsigned short events)
8787
ssize_t len;
8888
int exit_code = EXIT_FAILURE;
8989

90+
if (events & ELE_HANGUP)
91+
goto out;
92+
9093
if (events != ELE_READ)
9194
logerrx("%s: unexpected event 0x%04x", __func__, events);
9295

@@ -111,22 +114,17 @@ ps_root_readerrorcb(void *arg, unsigned short events)
111114
ssize_t
112115
ps_root_readerror(struct dhcpcd_ctx *ctx, void *data, size_t len)
113116
{
114-
struct psr_ctx psr_ctx = {
115-
.psr_ctx = ctx,
116-
.psr_data = data, .psr_datalen = len,
117-
};
118-
int fd = PS_ROOT_FD(ctx);
117+
struct psr_ctx *pc = ctx->ps_root->psp_data;
118+
int err;
119119

120-
if (eloop_event_add(ctx->ps_eloop, fd, ELE_READ,
121-
ps_root_readerrorcb, &psr_ctx) == -1)
122-
return -1;
123-
124-
eloop_enter(ctx->ps_eloop);
125-
eloop_start(ctx->ps_eloop, &ctx->sigset);
126-
eloop_event_delete(ctx->ps_eloop, fd);
120+
pc->psr_data = data;
121+
pc->psr_datalen = len;
122+
err = eloop_start(ctx->ps_eloop);
123+
if (err < 0)
124+
return err;
127125

128-
errno = psr_ctx.psr_error.psr_errno;
129-
return psr_ctx.psr_error.psr_result;
126+
errno = pc->psr_error.psr_errno;
127+
return pc->psr_error.psr_result;
130128
}
131129

132130
#ifdef PRIVSEP_GETIFADDRS
@@ -180,15 +178,15 @@ ps_root_mreaderror(struct dhcpcd_ctx *ctx, void **data, size_t *len)
180178
struct psr_ctx psr_ctx = {
181179
.psr_ctx = ctx,
182180
};
183-
int fd = PS_ROOT_FD(ctx);
181+
int fd = PS_ROOT_FD(ctx), err;
184182

185183
if (eloop_event_add(ctx->ps_eloop, fd, ELE_READ,
186184
ps_root_mreaderrorcb, &psr_ctx) == -1)
187185
return -1;
188186

189-
eloop_enter(ctx->ps_eloop);
190-
eloop_start(ctx->ps_eloop, &ctx->sigset);
191-
eloop_event_delete(ctx->ps_eloop, fd);
187+
err = eloop_start(ctx->ps_eloop, &ctx->sigset);
188+
if (err < 0)
189+
return err;
192190

193191
errno = psr_ctx.psr_error.psr_errno;
194192
*data = psr_ctx.psr_data;
@@ -873,8 +871,9 @@ ps_root_start(struct dhcpcd_ctx *ctx)
873871
.psi_cmd = PS_ROOT,
874872
};
875873
struct ps_process *psp;
876-
int logfd[2], datafd[2];
874+
int logfd[2] = { -1, -1}, datafd[2] = { -1, -1};
877875
pid_t pid;
876+
struct psr_ctx *pc;
878877

879878
if (xsocketpair(AF_UNIX, SOCK_SEQPACKET | SOCK_CXNB, 0, logfd) == -1)
880879
return -1;
@@ -892,10 +891,30 @@ ps_root_start(struct dhcpcd_ctx *ctx)
892891
return -1;
893892
#endif
894893

894+
895+
pc = malloc(sizeof(*pc));
896+
if (pc == NULL)
897+
return -1;
898+
pc->psr_ctx = ctx;
899+
895900
psp = ctx->ps_root = ps_newprocess(ctx, &id);
901+
if (psp == NULL)
902+
{
903+
free(pc);
904+
return -1;
905+
}
896906
strlcpy(psp->psp_name, "privileged proxy", sizeof(psp->psp_name));
897907
pid = ps_startprocess(psp, ps_root_recvmsg, NULL,
898-
ps_root_startcb, ps_root_signalcb, PSF_ELOOP);
908+
ps_root_startcb, PSF_ELOOP);
909+
if (pid == -1) {
910+
free(pc);
911+
return -1;
912+
}
913+
914+
psp->psp_data = pc;
915+
if (eloop_event_add(ctx->ps_eloop, psp->psp_fd, ELE_READ,
916+
ps_root_readerrorcb, pc) == -1)
917+
return -1;
899918

900919
if (pid == 0) {
901920
ctx->ps_log_fd = logfd[0]; /* Keep open to pass to processes */
@@ -916,7 +935,7 @@ ps_root_start(struct dhcpcd_ctx *ctx)
916935
close(datafd[1]);
917936
if (eloop_event_add(ctx->eloop, ctx->ps_data_fd, ELE_READ,
918937
ps_root_dispatch, ctx) == -1)
919-
return 1;
938+
return -1;
920939

921940
return pid;
922941
}

0 commit comments

Comments
 (0)