commit - e5c598d0a4ce1461dc9a6692ff48d34b475f1477
commit + 94404df807e123f4adb593433ee6e68bbf0378d0
blob - 5fbcd3605ceb5eaea9bd42f46af4df1498adaed8
blob + cf98615317c4d7643691014489e141fdffef8489
--- ca.c
+++ ca.c
-/* $OpenBSD: ca.c,v 1.17 2016/09/01 10:40:38 claudio Exp $ */
+/* $OpenBSD: ca.c,v 1.18 2016/09/02 11:51:49 reyk Exp $ */
/*
* Copyright (c) 2014 Reyk Floeter <reyk@openbsd.org>
{ "relay", PROC_RELAY, ca_dispatch_relay },
};
-pid_t
+void
ca(struct privsep *ps, struct privsep_proc *p)
{
env = ps->ps_env;
- return (proc_run(ps, p, procs, nitems(procs), ca_init, NULL));
+ proc_run(ps, p, procs, nitems(procs), ca_init, NULL);
}
void
blob - 3772faa405d442bcb60d939844b6be8ae9897aaf
blob + 84b811545744e53f3180932bf988462c380cbd1d
--- hce.c
+++ hce.c
-/* $OpenBSD: hce.c,v 1.72 2016/01/11 21:31:42 benno Exp $ */
+/* $OpenBSD: hce.c,v 1.73 2016/09/02 11:51:49 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
{ "relay", PROC_RELAY, hce_dispatch_relay },
};
-pid_t
+void
hce(struct privsep *ps, struct privsep_proc *p)
{
env = ps->ps_env;
/* this is needed for icmp tests */
icmp_init(env);
- return (proc_run(ps, p, procs, nitems(procs), hce_init, NULL));
+ proc_run(ps, p, procs, nitems(procs), hce_init, NULL);
}
void
blob - 36898d010a601c92f81dd3addcaf14f1510a2109
blob + 2ed98b81ed5f46a11056aefeb145285efd5ee7ad
--- pfe.c
+++ pfe.c
-/* $OpenBSD: pfe.c,v 1.83 2015/12/03 16:12:16 benno Exp $ */
+/* $OpenBSD: pfe.c,v 1.84 2016/09/02 11:51:49 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
{ "hce", PROC_HCE, pfe_dispatch_hce }
};
-pid_t
+void
pfe(struct privsep *ps, struct privsep_proc *p)
{
env = ps->ps_env;
- return (proc_run(ps, p, procs, nitems(procs), pfe_init, NULL));
+ proc_run(ps, p, procs, nitems(procs), pfe_init, NULL);
}
void
blob - c498685daaac5726876290b22ab7feb9b31f43ff
blob + 02f4bd3444e4f68f6eb36b5c740490590fa972ec
--- proc.c
+++ proc.c
-/* $OpenBSD: proc.c,v 1.27 2015/12/07 16:05:56 reyk Exp $ */
+/* $OpenBSD: proc.c,v 1.28 2016/09/02 11:51:49 reyk Exp $ */
/*
* Copyright (c) 2010 - 2014 Reyk Floeter <reyk@openbsd.org>
privsep_process = PROC_PARENT;
ps->ps_instances[PROC_PARENT] = 1;
ps->ps_title[PROC_PARENT] = "parent";
- ps->ps_pid[PROC_PARENT] = getpid();
ps->ps_pp = &ps->ps_pipes[privsep_process][0];
for (i = 0; i < nproc; i++) {
/* Engage! */
for (i = 0; i < nproc; i++)
- ps->ps_pid[procs[i].p_id] = (*procs[i].p_init)(ps, &procs[i]);
+ (*procs[i].p_init)(ps, &procs[i]);
}
void
proc_kill(struct privsep *ps)
{
+ char *cause;
pid_t pid;
- unsigned int i;
+ int len, status;
if (privsep_process != PROC_PARENT)
return;
- for (i = 0; i < PROC_MAX; i++) {
- if (ps->ps_pid[i] == 0)
- continue;
- killpg(ps->ps_pid[i], SIGTERM);
- }
+ proc_close(ps);
do {
- pid = waitpid(WAIT_ANY, NULL, 0);
+ pid = waitpid(WAIT_ANY, &status, 0);
+ if (pid <= 0)
+ continue;
+
+ if (WIFSIGNALED(status)) {
+ len = asprintf(&cause, "terminated; signal %d",
+ WTERMSIG(status));
+ } else if (WIFEXITED(status)) {
+ if (WEXITSTATUS(status) != 0)
+ len = asprintf(&cause, "exited abnormally");
+ else
+ len = 0;
+ } else
+ len = -1;
+
+ if (len == 0) {
+ /* child exited OK, don't print a warning message */
+ } else if (len != -1) {
+ log_warnx("lost child: pid %u %s", pid, cause);
+ free(cause);
+ } else
+ log_warnx("lost child: pid %u", pid);
} while (pid != -1 || (pid == -1 && errno == EINTR));
-
- proc_close(ps);
}
void
}
}
-pid_t
+void
proc_run(struct privsep *ps, struct privsep_proc *p,
struct privsep_proc *procs, unsigned int nproc,
void (*run)(struct privsep *, struct privsep_proc *, void *), void *arg)
unsigned int n;
if (ps->ps_noaction)
- return (0);
+ return;
proc_open(ps, p, procs, nproc);
setpgid(0, 0);
break;
default:
- return (pid);
+ return;
}
pw = ps->ps_pw;
event_dispatch();
proc_shutdown(p);
-
- return (0);
}
void
blob - 33a49782f50d9ef6de75b246098dc8c08776f410
blob + 1c809ebec62673fe1cb955eec1a18e9bb02cca08
--- relay.c
+++ relay.c
-/* $OpenBSD: relay.c,v 1.207 2016/09/01 10:49:48 claudio Exp $ */
+/* $OpenBSD: relay.c,v 1.208 2016/09/02 11:51:49 reyk Exp $ */
/*
* Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org>
{ "hce", PROC_HCE, relay_dispatch_hce },
};
-pid_t
+void
relay(struct privsep *ps, struct privsep_proc *p)
{
- pid_t pid;
-
env = ps->ps_env;
- pid = proc_run(ps, p, procs, nitems(procs), relay_init, NULL);
+ proc_run(ps, p, procs, nitems(procs), relay_init, NULL);
relay_http(env);
- return (pid);
}
void
blob - abb226d74af92ba5b19469e283d4318190126dcf
blob + 4d8fbb292f22f3291421315b4b2f0fd9f9653c6d
--- relayd.c
+++ relayd.c
-/* $OpenBSD: relayd.c,v 1.156 2016/09/01 10:49:48 claudio Exp $ */
+/* $OpenBSD: relayd.c,v 1.157 2016/09/02 11:51:50 reyk Exp $ */
/*
* Copyright (c) 2007 - 2016 Reyk Floeter <reyk@openbsd.org>
parent_sig_handler(int sig, short event, void *arg)
{
struct privsep *ps = arg;
- int die = 0, status, fail, id;
- pid_t pid;
- char *cause;
switch (sig) {
case SIGTERM:
case SIGINT:
- die = 1;
- /* FALLTHROUGH */
- case SIGCHLD:
- do {
- int len;
-
- pid = waitpid(WAIT_ANY, &status, WNOHANG);
- if (pid <= 0)
- continue;
-
- fail = 0;
- if (WIFSIGNALED(status)) {
- fail = 1;
- len = asprintf(&cause, "terminated; signal %d",
- WTERMSIG(status));
- } else if (WIFEXITED(status)) {
- if (WEXITSTATUS(status) != 0) {
- fail = 1;
- len = asprintf(&cause,
- "exited abnormally");
- } else
- len = asprintf(&cause, "exited okay");
- } else
- fatalx("unexpected cause of SIGCHLD");
-
- if (len == -1)
- fatal("asprintf");
-
- die = 1;
-
- for (id = 0; id < PROC_MAX; id++)
- if (pid == ps->ps_pid[id]) {
- if (fail)
- log_warnx("lost child: %s %s",
- ps->ps_title[id], cause);
- break;
- }
-
- free(cause);
- } while (pid > 0 || (pid == -1 && errno == EINTR));
-
- if (die)
- parent_shutdown(ps->ps_env);
+ parent_shutdown(ps->ps_env);
break;
case SIGHUP:
log_info("%s: reload requested with SIGHUP", __func__);
signal_set(&ps->ps_evsigint, SIGINT, parent_sig_handler, ps);
signal_set(&ps->ps_evsigterm, SIGTERM, parent_sig_handler, ps);
- signal_set(&ps->ps_evsigchld, SIGCHLD, parent_sig_handler, ps);
signal_set(&ps->ps_evsighup, SIGHUP, parent_sig_handler, ps);
signal_set(&ps->ps_evsigpipe, SIGPIPE, parent_sig_handler, ps);
signal_set(&ps->ps_evsigusr1, SIGUSR1, parent_sig_handler, ps);
signal_add(&ps->ps_evsigint, NULL);
signal_add(&ps->ps_evsigterm, NULL);
- signal_add(&ps->ps_evsigchld, NULL);
signal_add(&ps->ps_evsighup, NULL);
signal_add(&ps->ps_evsigpipe, NULL);
signal_add(&ps->ps_evsigusr1, NULL);
blob - 31b3211fa5d8309c0b4c83617dc44cc8d0afe2c1
blob + e713ec0e55e197d2081a442dce4a76fcd5a07ec0
--- relayd.h
+++ relayd.h
-/* $OpenBSD: relayd.h,v 1.227 2016/09/01 10:49:48 claudio Exp $ */
+/* $OpenBSD: relayd.h,v 1.228 2016/09/02 11:51:50 reyk Exp $ */
/*
* Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org>
struct imsgev *ps_ievs[PROC_MAX];
const char *ps_title[PROC_MAX];
- pid_t ps_pid[PROC_MAX];
u_int8_t ps_what[PROC_MAX];
u_int ps_instances[PROC_MAX];
enum privsep_procid p_id;
int (*p_cb)(int, struct privsep_proc *,
struct imsg *);
- pid_t (*p_init)(struct privsep *,
+ void (*p_init)(struct privsep *,
struct privsep_proc *);
void (*p_shutdown)(void);
u_int p_instance;
void getmonotime(struct timeval *);
/* pfe.c */
-pid_t pfe(struct privsep *, struct privsep_proc *);
+void pfe(struct privsep *, struct privsep_proc *);
void show(struct ctl_conn *);
void show_sessions(struct ctl_conn *);
int enable_rdr(struct ctl_conn *, struct ctl_id *);
int pfe_route(struct relayd *, struct ctl_netroute *);
/* hce.c */
-pid_t hce(struct privsep *, struct privsep_proc *);
+void hce(struct privsep *, struct privsep_proc *);
void hce_notify_done(struct host *, enum host_error);
/* relay.c */
-pid_t relay(struct privsep *, struct privsep_proc *);
+void relay(struct privsep *, struct privsep_proc *);
int relay_privinit(struct relay *);
void relay_notify_done(struct host *, const char *);
int relay_session_cmp(struct rsession *, struct rsession *);
char *, off_t, X509 **, EVP_PKEY **);
/* ca.c */
-pid_t ca(struct privsep *, struct privsep_proc *);
+void ca(struct privsep *, struct privsep_proc *);
void ca_engine_init(struct relayd *);
/* relayd.c */
void proc_kill(struct privsep *);
void proc_listen(struct privsep *, struct privsep_proc *, size_t);
void proc_dispatch(int, short event, void *);
-pid_t proc_run(struct privsep *, struct privsep_proc *,
+void proc_run(struct privsep *, struct privsep_proc *,
struct privsep_proc *, u_int,
void (*)(struct privsep *, struct privsep_proc *, void *), void *);
void proc_range(struct privsep *, enum privsep_procid, int *, int *);