On 12/14/18 4:16 PM, Richard W.M. Jones wrote:
This implements something like a readonly 1MB disk reading as
zeroes:
nbdkit sh script=- <<'EOF'
case "$1" in
get_size) echo 1M ;;
pread) dd if=/dev/zero count=$3 iflag=count_bytes ;;
*) exit 2 ;;
esac
EOF
Use of "-" is analogous to reading passwords from stdin.
---
@@ -26,6 +30,19 @@ like this:
You may have to add further C<key=value> arguments to the command
line.
+=head2 Inline shell scripts
+
+It is also possible to write a shell script plugin "inline" using C<->
+as the name of the script, like this:
+
+ nbdkit sh script=- <<'EOF'
+ case "$1" in
+ get_size) echo 1M ;;
+ pread) dd if=/dev/zero count=$3 iflag=count_bytes ;;
+ *) exit 2 ;;
+ esac
+ EOF
+
Worth a specific mention that 'script=' is required, since otherwise the
'-' looks like an option to nbdkit proper rather than a script parameter?
Probably not worth a mention that a local file named '-' can still be
invoked via [script=]./- (there, script is optional because the leading
./ avoids the leading -).
+static char *
+inline_script (void)
+{
+ const char scriptname[] = "inline-script.sh";
+ char *filename = NULL;
+ char *cmd = NULL;
+
+ if (asprintf (&filename, "%s/%s", tmpdir, scriptname) == -1) {
+ nbdkit_error ("asprintf: %m");
+ goto err;
+ }
+
+ /* Safe because both the tmpdir and script name are controlled by us
+ * and don't contain characters that need quoting.
+ */
+ if (asprintf (&cmd, "cat > %s", filename) == -1) {
Useful comment :) And I verified it is true.
Looks good.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization:
qemu.org |
libvirt.org