On 11/03/2019 11:31, Unai Martinez-Corral wrote: > This is a partial implementation. > > Allows to remove a single or a list of already registered binfmt > interpreters. Valid values are those in qemu_target_list. > If TARGETS is empty, all the existing 'qemu-*' interpreters are > removed. > > This is partial because 'debian' and 'systemd' configurations are not > supported. The script will exit with error 'option clear not > implemented for this mode yet'. > > Removal is done by printing '-1' as explained at: > https://www.kernel.org/doc/Documentation/admin-guide/binfmt-misc.rst > > Signed-off-by: Unai Martinez-Corral <unai.martinezcor...@ehu.eus> > --- > scripts/qemu-binfmt-conf.sh | 41 ++++++++++++++++++++++++++++++++++--- > 1 file changed, 38 insertions(+), 3 deletions(-) > > diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh > index fde78517ff..07d1ee1f04 100755 > --- a/scripts/qemu-binfmt-conf.sh > +++ b/scripts/qemu-binfmt-conf.sh > @@ -196,7 +196,7 @@ Options and associated environment variables: > > Argument Env-variable Description > TARGETS QEMU_TARGETS A single arch name or a list of them > (see all names below); > - if empty, configure all known targets; > + if empty, configure/clear all known > targets; > if 'NONE', no interpreter is > configured. > -h|--help display this usage > -Q|--path PATH: QEMU_PATH set path to qemu interpreter(s) > @@ -206,9 +206,10 @@ TARGETS QEMU_TARGETS A single arch name > or a list of them (see > systemd-binfmt.service; environment > variable HOST_ARCH > allows to override 'uname' to generate > configuration files > for a different architecture than the > current one. > - > -e|--exportdir PATH: DEBIANDIR define where to write configuration > files > SYSTEMDDIR > +-c|--clear: QEMU_CLEAR (yes) remove registered interpreters > for target TARGETS; > + then exit. > -c|--credential: QEMU_CREDENTIAL (yes) credential and security tokens > are calculated according > to the binary to interpret > -p|--persistent: QEMU_PERSISTENT (yes) load the interpreter and keep it > in memory; all future > @@ -336,6 +337,25 @@ qemu_set_binfmts() { > done > } > > +qemu_clear_notimplemented() { > + echo "ERROR: option clear not implemented for this mode yet" 1>&2 > + usage > + exit 1 > +} > + > +qemu_clear_interpreter() { > + names='qemu-*' > + if [ $# -ne 0 ] ; then > + qemu_check_target_list $1 > + unset names pre > + for t in $checked_target_list ; do > + names="${names}${pre}qemu-$t" > + pre=' -o -name ' > + done > + fi > + find /proc/sys/fs/binfmt_misc/ -type f -name $names -exec sh -c 'printf > %s -1 > {}' \;
The qemu-* will be expanded here if you have a qemu-XXX in the current directory. You must use "$names". But: To remove all, you can do: sh -c 'printf %s -1 > /proc/sys/fs/binfmt_misc/status' so something like if [ $# -eq 0 ] ; then sh -c 'printf %s -1 > /proc/sys/fs/binfmt_misc/status fi qemu_check_target_list $1 for t in $checked_target_list ; do sh -c 'printf %s -1 > /proc/sys/fs/binfmt_misc/qemu-$t' done But I think you should also taking care of the suffix. > +} > + > CHECK=qemu_check_bintfmt_misc > BINFMT_SET=qemu_register_interpreter > > @@ -347,12 +367,16 @@ QEMU_PATH="${QEMU_PATH:-/usr/local/bin}" > QEMU_SUFFIX="${QEMU_SUFFIX:-}" > QEMU_CREDENTIAL="${QEMU_CREDENTIAL:-no}" > QEMU_PERSISTENT="${QEMU_PERSISTENT:-no}" > +QEMU_CLEAR="${QEMU_CLEAR:-no}" > > -options=$(getopt -o dsQ:S:e:hcp -l > debian,systemd,path:,suffix:,exportdir:,help,credential,persistent -- "$@") > +options=$(getopt -o cdsQ:S:e:hcp -l > clear,debian,systemd,path:,suffix:,exportdir:,help,credential,persistent -- > "$@") > eval set -- "$options" > > while true ; do > case "$1" in > + -c|--clear) > + QEMU_CLEAR="yes" > + ;; > -d|--debian) > CHECK=qemu_check_debian > BINFMT_SET=qemu_generate_debian > @@ -395,4 +419,15 @@ done > shift > > $CHECK > + > +if [ "x$QEMU_CLEAR" = "xyes" ] ; then > + case "$BINFMT_SET" in > + *debian) BINFMT_CLEAR=qemu_clear_notimplemented ;; > + *systemd) BINFMT_CLEAR=qemu_clear_notimplemented ;; > + *) BINFMT_CLEAR=qemu_clear_interpreter > + esac Put this in the previous case for decoding options, please. > + $BINFMT_CLEAR "$@" > + exit > +fi > + > qemu_set_binfmts "$@" > -- > 2.21.0 >