[Libguestfs] [PATCH nbdkit 1/3] sh: Implement inline scripts.

Richard W.M. Jones rjones at redhat.com
Sat Dec 15 07:22:41 UTC 2018


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




More information about the Libguestfs mailing list