Module Name: src
Committed By: riastradh
Date: Thu Apr 4 17:27:23 UTC 2024
Modified Files:
src/lib/librumpuser: rumpuser_daemonize.c
Log Message:
rumpuser(3): New RUMP_STDOUT, RUMP_STDERR environment variables.
If set, then when rump daemonizes, it opens the path in RUMP_STDOUT
and redirects fd 1 to that (which mostly gets the kernel console
output), and opens the path in RUMP_STDERR and redirects fd 2 to that
(no idea what this gets but it's probably good to record if it ever
gets anything).
This will allow tests that rely on rump_server daemons to stash the
output for diagnostics in case, e.g., the rump kernel crashes.
PR bin/58112
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/lib/librumpuser/rumpuser_daemonize.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/librumpuser/rumpuser_daemonize.c
diff -u src/lib/librumpuser/rumpuser_daemonize.c:1.8 src/lib/librumpuser/rumpuser_daemonize.c:1.9
--- src/lib/librumpuser/rumpuser_daemonize.c:1.8 Thu Aug 3 20:45:49 2023
+++ src/lib/librumpuser/rumpuser_daemonize.c Thu Apr 4 17:27:23 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpuser_daemonize.c,v 1.8 2023/08/03 20:45:49 andvar Exp $ */
+/* $NetBSD: rumpuser_daemonize.c,v 1.9 2024/04/04 17:27:23 riastradh Exp $ */
/*
* Copyright (c) 2010 Antti Kantee. All Rights Reserved.
@@ -28,7 +28,7 @@
#include "rumpuser_port.h"
#if !defined(lint)
-__RCSID("$NetBSD: rumpuser_daemonize.c,v 1.8 2023/08/03 20:45:49 andvar Exp $");
+__RCSID("$NetBSD: rumpuser_daemonize.c,v 1.9 2024/04/04 17:27:23 riastradh Exp $");
#endif /* !lint */
#include <sys/types.h>
@@ -53,6 +53,27 @@ static int daemonpipe[2];
#include <rump/rumpuser.h>
+static int
+openstdoutstderr(void)
+{
+ char path[PATH_MAX];
+ int fd;
+
+ if (getenv_r("RUMP_STDOUT", path, sizeof(path)) == 0) {
+ if ((fd = open(path, O_WRONLY|O_CREAT)) == -1)
+ return -1;
+ dup2(fd, STDOUT_FILENO);
+ (void)close(fd);
+ }
+ if (getenv_r("RUMP_STDERR", path, sizeof(path)) == 0) {
+ if ((fd = open(path, O_WRONLY|O_CREAT)) == -1)
+ return -1;
+ dup2(fd, STDERR_FILENO);
+ (void)close(fd);
+ }
+ return 0;
+}
+
int
rumpuser_daemonize_begin(void)
{
@@ -82,6 +103,13 @@ rumpuser_daemonize_begin(void)
goto out;
}
+ if (openstdoutstderr() == -1) {
+ rv = errno;
+ (void)close(daemonpipe[0]);
+ (void)close(daemonpipe[1]);
+ goto out;
+ }
+
switch (fork()) {
case 0:
if (setsid() == -1) {
@@ -125,8 +153,10 @@ rumpuser_daemonize_done(int error)
goto out;
}
dup2(fd, STDIN_FILENO);
- dup2(fd, STDOUT_FILENO);
- dup2(fd, STDERR_FILENO);
+ if (getenv("RUMP_STDOUT") == NULL)
+ dup2(fd, STDOUT_FILENO);
+ if (getenv("RUMP_STDERR") == NULL)
+ dup2(fd, STDERR_FILENO);
if (fd > STDERR_FILENO)
close(fd);
}