All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yann E. MORIN <yann.morin.1998@free.fr>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH] package/linux-firmware: fix special cases of symlinks
Date: Wed, 4 Mar 2020 18:00:09 +0100	[thread overview]
Message-ID: <20200304170009.GA5357@scaer> (raw)
In-Reply-To: <20200304105304.986863-1-antoine.tenart@bootlin.com>

Antoine, All,

On 2020-03-04 11:53 +0100, Antoine Tenart spake thusly:
> Some symlinks were not created correctly when installing the
> Linux-firmware package. This patch fixes the support for all symlinks of
> the form:
> 
>   a/foo -> bar
>   a/foo -> b/bar
>   a/foo -> ../b/bar
> 
> With this patch all forms of symlinks described in the WHENCE file
> should be supported, whether they are in nested directories, or in
> non-existing ones.
> 
> As some symlinks could be in directories that do not exist, we must
> make sure those directories are created before testing the presence of
> the target firmwares, as we'll end up testing files like:
> 
>   a/foo -> ../b/foo : test -f a/../b/foo
> 
> where a/ did not exist prior to our symlink creation logic. We then
> remove the created directories, if they're empty (that would mean the
> target firmware wasn't installed). As we could have nested empty
> directories (think of the following link: a/b/c/foo -> ../../../foo), we
> need to also remove empty parent directories. To avoid removing more
> than we created, we change directory to $(TARGET_DIR)/lib/firmware/
> before doing anything.
> 
> I compared the symlinks installed pre-20200122 to what we have now, and
> it seems we're handling all of them with this patch.
> 
> Fixes: 55df4059d24b ("package/linux-firmware: fix symlink support")
> Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>

Thanks for this quick new iteration! :-)

I have some comments, below...

> ---
>  package/linux-firmware/linux-firmware.mk | 17 ++++++++++++++---
>  1 file changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/package/linux-firmware/linux-firmware.mk b/package/linux-firmware/linux-firmware.mk
> index 009202d604d4..e367d4c5e7b8 100644
> --- a/package/linux-firmware/linux-firmware.mk
> +++ b/package/linux-firmware/linux-firmware.mk
> @@ -609,13 +609,24 @@ endif
>  # automatically by its copy-firmware.sh script during the installation, which
>  # parses the WHENCE file where symlinks are described. We follow the same logic
>  # here, adding symlink only for firmwares installed in the target directory.
> -# The grep/sed parsing is taken from the script mentioned before.
> +#
> +# For testing the presence of firmwares in the target directory we first make
> +# sure the directories under which the symlinks could be created exist, to
> +# handle symlinks of the form a/foo -> ../b/foo where a/ doesn't exist. We then
> +# remove any previously created empty directory. As the symlinks could be in
> +# nested (empty) directories, we use the --parents option of rmdir; this is why
> +# we're changing the current directory to $(TARGET_DIR)/lib/firmware/ before
> +# doing anything.
>  define LINUX_FIRMWARE_CREATE_SYMLINKS
> +	cd $(TARGET_DIR)/lib/firmware/ ; \
>  	sed -r -e '/^Link: (.+) -> (.+)$$/!d; s//\1 \2/' $(@D)/WHENCE | \
>  	while read f d; do \
> -		if test -f $(TARGET_DIR)/lib/firmware/$$d; then \
> -			ln -sf $$d $(TARGET_DIR)/lib/firmware/$$f || exit 1; \
> +		dir=$$(dirname $$f) ; \
> +		mkdir -p $$dir ; \
> +		if test -f $$dir/$$d; then \
> +			ln -sf $$d $$f || exit 1; \
>  		fi ; \
> +		test "$$dir" != "." && rmdir --parents --ignore-fail-on-non-empty $$dir ; \

I was not too happy about this create-a-directory-then-remove-it-if-it-turned-
out-we-did-not-need-it dance.

So, I hacked it, using readlink -m, and come up with something that I
think is simpler and easier to grok:

    https://patchwork.ozlabs.org/patch/1249126/

I think even the cd into the firmware directory was not even needed, but
I firgit to remove it to test...

Regards,
Yann E. MORIN.

>  	done
>  endef
>  
> -- 
> 2.24.1
> 

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

  reply	other threads:[~2020-03-04 17:00 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-04 10:53 [Buildroot] [PATCH] package/linux-firmware: fix special cases of symlinks Antoine Tenart
2020-03-04 17:00 ` Yann E. MORIN [this message]
2020-03-04 18:37   ` Antoine Tenart
2020-03-04 18:54     ` Yann E. MORIN

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200304170009.GA5357@scaer \
    --to=yann.morin.1998@free.fr \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.