[supermin PATCH] build: ignore empty files
by Pino Toscano
Do not error out on empty files, just ignore them.
---
src/mode_build.ml | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/mode_build.ml b/src/mode_build.ml
index b5f5fa6..9cd0a21 100644
--- a/src/mode_build.ml
+++ b/src/mode_build.ml
@@ -46,6 +46,7 @@ and file_content =
| Packages
| Hostfiles
| Excludefiles
+| Empty
let rec string_of_file_type = function
| GZip c -> sprintf "gzip %s" (string_of_file_content c)
@@ -56,6 +57,7 @@ and string_of_file_content = function
| Packages -> "packages"
| Hostfiles -> "hostfiles"
| Excludefiles -> "excludefiles"
+ | Empty -> "(empty)"
let rec build debug
(copy_kernel, format, host_cpu,
@@ -250,6 +252,8 @@ and read_appliance debug basedir appliance = function
(* Depending on the file type, read or unpack the file. *)
let appliance =
match file_type with
+ | Uncompressed Empty | GZip Empty | XZ Empty ->
+ appliance
| Uncompressed ((Packages|Hostfiles|Excludefiles) as t) ->
let chan = open_in file in
let lines = input_all_lines chan in
@@ -294,7 +298,7 @@ and update_appliance appliance lines = function
String.sub path 1 (n-1)
) lines in
{ appliance with excludefiles = appliance.excludefiles @ lines }
- | Base_image -> assert false
+ | Base_image | Empty -> assert false
(* Determine the [file_type] of [file], or exit with an error. *)
and get_file_type file =
@@ -331,6 +335,7 @@ and get_file_content file buf len =
else if len >= 2 && buf.[0] = '/' then Hostfiles
else if len >= 2 && buf.[0] = '-' then Excludefiles
else if len >= 1 && isalnum buf.[0] then Packages
+ else if len = 0 then Empty
else error "%s: unknown file type in supermin directory" file
and get_compressed_file_content zcat file =
--
2.17.2
5 years, 11 months
[nbdkit PATCH] sh: Don't let child inherit SIGPIPE ignored
by Eric Blake
While nbdkit itself must run with SIGPIPE ignored, many applications
expect to inherit SIGPIPE in the default state. What's worse, POSIX
states that a non-interactive shell script cannot use 'trap' to
undo an inherited SIG_IGN on SIGPIPE. I have seen several bug
reports over the years of something that works for a developer but
fails under a CI environment, where the root cause was the CI
leaking an ignored SIGPIPE into the file under test.
Testing this proved to be the more interesting part of the patch.
'yes' is probably the easiest way to generate lots of data and
which behaves differently if SIGPIPE is ignored, but I'm not
certain if coreutils is always installed on BSD machines. Also
fix a missing redirect to stderr in the probe for $tmpdir.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
plugins/sh/call.c | 3 +++
tests/test-shell.sh | 14 +++++++++++++-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/plugins/sh/call.c b/plugins/sh/call.c
index 9b3eca8..42923da 100644
--- a/plugins/sh/call.c
+++ b/plugins/sh/call.c
@@ -121,6 +121,9 @@ call3 (const char *wbuf, size_t wbuflen, /* sent to stdin */
close (out_fd[1]);
close (err_fd[1]);
+ /* Restore SIGPIPE back to SIG_DFL, since shell can't undo SIG_IGN */
+ signal (SIGPIPE, SIG_DFL);
+
/* Set $tmpdir for the script. */
setenv ("tmpdir", tmpdir, 1);
diff --git a/tests/test-shell.sh b/tests/test-shell.sh
index ef438ec..eabd4fe 100755
--- a/tests/test-shell.sh
+++ b/tests/test-shell.sh
@@ -11,10 +11,22 @@ fi
# nbdkit is supposed to set $tmpdir. If it doesn't, it's an error.
if [ ! -d $tmpdir ]; then
- echo "\$tmpdir was not set"
+ echo "\$tmpdir was not set" >&2
exit 1
fi
+# Check that SIGPIPE is not ignored unless we want it that way.
+if (type yes) >/dev/null 2>&1; then
+ ignored=$(trap "" 13;
+ ({ yes; echo $? >&3; } | head -c1) 3>&1 >/dev/null 2>&1)
+ default=$(trap - 13;
+ ({ yes; echo $? >&3; } | head -c1) 3>&1 >/dev/null 2>&1)
+ if [ $ignored = $default ]; then
+ echo "SIGPIPE was inherited ignored" >&2
+ exit 1;
+ fi
+fi
+
case "$1" in
open)
echo handle
--
2.17.2
5 years, 11 months