On Fri, Dec 14, 2018 at 04:31:32PM -0600, Eric Blake wrote:
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?
Actually I tried using just "-" (for the first time, I didn't try it
before) and it works. So the above can be written:
nbdkit sh - <<'EOF'
case "$1" in
get_size) echo 1M ;;
pread) dd if=/dev/zero count=$3 iflag=count_bytes ;;
*) exit 2 ;;
esac
EOF
At least on Linux. I wonder if that also works on FreeBSD etc and if
it depends on an implementation detail of the parser. I'll have to do
some more investigations.
Rich.
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
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top