Hi Stefan,
Stefan <[email protected]> skribis:
> * gnu/packages/virtualization.scm (qemu): Add a snippet to fix a bug in the
> do_ioctl_ifconf() function of qemu to make ioclt(…, SIOCGIFCONF, …) work for
> emulated 64 bit architectures.
>
> The sizeof(struct ifreq) is 40 for 64 bit and 32 for 32 bit architectures.
> This structure contains a union of other structures, of which struct ifmap
> is the biggest for 64 bit architectures. Calling ioclt(…, SIOCGIFCONF, …)
> fills a struct sockaddr of that union, and do_ioctl_ifconf() only considered
> that struct sockaddr for the size of the union, which has the same size as
> struct ifmap on 32 bit architectures. So do_ioctl_ifconf() assumed a wrong
> size of 32 for struct ifreq instead of the correct size of 40 on 64 bit
> architectures.
>
> The fix makes do_ioctl_ifconf() handle struct ifmap as the biggest part of
> the union, treating struct ifreq with the correct size.
>
> This fixes (@ (guix build syscalls) network-interface-names) when used in
> emulated 64 bit architectures.
Woow, good catch!
> + (modules '((guix build utils)))
> + (snippet
> + '(begin
> + (substitute* '("linux-user/syscall.c")
> + (("^([[:blank:]]*)const argtype ifreq_arg_type.*$" line
> indent)
> + (string-append line indent
> + "const argtype ifreq_max_type[] = {
> MK_STRUCT(STRUCT_ifmap_ifreq) };\n"))
> + (("^([[:blank:]]*)target_ifreq_size[[:blank:]]=.*$" _
> indent)
> + (string-append indent "target_ifreq_size =
> thunk_type_size(ifreq_max_type, 0);")))
> + #t))))
Could you move the explanation as a comment above the ‘substitute*’
form, and/or link to the upstream bug report/discussion/submission?
Thank you!
Ludo’.