On Mon, Oct 09, 2023 at 01:32:07PM +0200, Laszlo Ersek wrote:
> On 10/9/23 13:12, Richard W.M. Jones wrote:
> > On Mon, Oct 09, 2023 at 12:57:14PM +0200, Laszlo Ersek wrote:
> >> On 10/9/23 09:46, Richard W.M. Jones wrote:
> >>> Hi Eric, a couple of POSIX questions for you from nbdkit.
> >>>
> >>> The first question is from an AUR comment on nbdkit:
> >>>
> >>>   https://aur.archlinux.org/packages/nbdkit#comment-937381
> >>>
> >>> I think there's a bash-ism in the logscript parameter in this test:
> >>>
> >>>   
> >>> https://gitlab.com/nbdkit/nbdkit/-/blame/master/tests/test-log-script-info.sh#L51
> >>>
> >>> I believe it is happening in the $(( .. )) expression.  How do we
> >>> write that so it'll work in a posix shell?
> >>
> >> (I'm not Eric, but curious! :) )
> >>
> >> Here I think we should just explicitly insist on bash.
> > 
> > Unfortunately we can't do that, not easily anyway.
> > 
> > We use bash for writing the test scripts because it's the sane choice
> > for shell programming, and we declare /bin/bash (or something with
> > 'env') at the top of each of those scripts.  This introduces a *build*
> > dependency from nbdkit to /bin/bash.  That's all fine.
> > 
> > However when nbdkit is installed in production & runs an external
> > script, it uses system(3) which uses /bin/sh.  That might not be bash,
> > and indeed bash might not even be installed on the same machine as
> > nbdkit.
> > 
> > [Note: I think the whole Debian dash-for-/bin/sh is the stupidest idea
> > I ever heard, but (a) it's a thing and (b) there's BSD and Macs where
> > they don't want to use bash for licensing reasons.]
> > 
> > Arguably for the tests we could have some way to cause nbdkit to use
> > /bin/bash instead of /bin/sh when running external scripts, but it's
> > major complexity to implement.
> > 
> > So we gotta use a lowest common denominator for these external
> > scripts, even in our tests.  Note only this one test is affected.
> > 
> > [Aside: Windows is a whole separate kettle of fish.  Currently the
> > Windows port of nbdkit doesn't support --run for other reasons, but if
> > it did it would probably run some Windows-ish thing (COMMAND.COM?
> > Power Shell?).  I'm not sure how Windows behaves for the other
> > external commands we try to run like logscript.]
> > 
> >> Shell arrays are
> >> a bash-specific feature, and the extent array is deeply ingrained. See
> >> especially commit df63b23b6280 ("log: Use strict shell quoting for every
> >> parameter displayed in the log file.", 2021-01-04). In particular the
> >> assignment
> >>
> >> extents=(0x0 0x8000 "hole,zero" 0x8000 0x8000 "")
> >>
> >> turns "extents" into an array variable.
> >>
> >> In the bug tracker, comment
> >> <https://aur.archlinux.org/packages/nbdkit#comment-937375> says, "Thus
> >> this is an upstream issue; their scripts are calling sh when they should
> >> be calling bash". I think that's correct; for logscript=..., we should
> >> require /bin/bash in the manual, and execute the script with /bin/bash
> >> explicitly, not just system().
> > 
> > This would create a runtime dependency from nbdkit to /bin/bash which
> > I'd like to avoid.
> 
> The runtime dependency is already there in our logscript interface; the
> 
>   name=(a b c ... z)
> 
> syntax is already bash-only, for defining a shell array.

Hmm, the extents are indeed passed as a flattened array, ie.

  extents=(<offset> <length> "<descr>" [repeats ...])

I don't think I was aware this wasn't in POSIX.

However that's a dependency from _nbdkit-log-filter_ to bash, which is
slightly different.  (Nevertheless it'd be nice if we could remove it ...)

> So the question is basically how to best emulate an array in the POSIX
> shell. Some (rough) options that occur to me:
> 
> - Use named variables such as name_0, name_1, name_2, ... and so on.
> Requires eval tricks, and if the array is large, it creates many
> variables, which some shells (?) may have issues with.
> 
> - Generate a shell function with a huge case statement; like "get_name
> 0" should print "a", "get_name 1" should print "b", etc. The caller
> would then do
> 
>   element=$(get_name $idx)
> 
> - write the elements of the array to a text file (one, quoted, element
> per line), and then use a combination of "tail" and "head" for fetching
> the right line. Incredibly slow, of course.
> 
> ... I'm sure stackoverflow has further / better ideas for emulating
> arrays in the POSIX shell.
> 
> And then, because keeping the current (fast, but nonportable) solution
> would be nice, we should probably add a new argument for the log filter,
> "compat" or "posix" or some such, which would select the more restricted
> interface.

Yup.

Rich.

-- 
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
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to