Hi Stefan, Stefan <stefan-g...@vodafonemail.de> 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’.