On 02.11.2017 17:55, Peter Maydell wrote: > On 28 October 2017 at 20:48, Kamil Rytarowski <[email protected]> wrote: >> NetBSD 8.0(beta) ships with KERN_PROC_PATHNAME in sysctl(2). >> Older NetBSD versions can use argv[0] parsing fallback. >> >> This code section is partly shared with FreeBSD. >> >> Signed-off-by: Kamil Rytarowski <[email protected]> >> --- >> util/oslib-posix.c | 11 ++++++++++- >> 1 file changed, 10 insertions(+), 1 deletion(-) >> >> diff --git a/util/oslib-posix.c b/util/oslib-posix.c >> index 382bd4a231..77369c92ce 100644 >> --- a/util/oslib-posix.c >> +++ b/util/oslib-posix.c >> @@ -49,6 +49,10 @@ >> #include <libutil.h> >> #endif >> >> +#ifdef __NetBSD__ >> +#include <sys/sysctl.h> >> +#endif >> + >> #include "qemu/mmap-alloc.h" >> >> #ifdef CONFIG_DEBUG_STACK_USAGE >> @@ -250,9 +254,14 @@ void qemu_init_exec_dir(const char *argv0) >> p = buf; >> } >> } >> -#elif defined(__FreeBSD__) >> +#elif defined(__FreeBSD__) \ >> + || (defined(__NetBSD__) && defined(KERN_PROC_PATHNAME)) >> { >> +#if defined(__FreeBSD__) >> static int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; >> +#else >> + static int mib[4] = {CTL_KERN, KERN_PROC_ARGS, -1, >> KERN_PROC_PATHNAME}; >> +#endif >> size_t len = sizeof(buf) - 1; >> >> *buf = '\0'; > > It's a shame the BSDs can't agree on a single way to implement this :-( > > I had a look at how Go implements this: > https://github.com/golang/go/commit/2fc67e71af142bfa1e7662a4fde361f43509d2d7 > > and for NetBSD it uses readlink("/proc/curproc/exe"), which would be > a better fallback for "sysctl not implemented" than the argv[0] > stuff, perhaps (but then nobody's complained much so perhaps not > worth the effort now). It also has /proc/curproc/file for OpenBSD, but > my OpenBSD VM doesn't mount /proc/, which reduces my enthusiasm > for trying for a "generic for BSDs try various /proc/ paths" approach. > > In any case, I think this is better than what we have today, > so I've applied it to master. >
It's better to assume that there is no such entity as a shared BSD code in modern BSD Operating Systems. My opinion is to drop CONFIG_BSD entirely from qemu and treat __NetBSD__, __FreeBSD__ and __OpenBSD__ as diverse targets. (I'm not sure how about bsd-user, whether it should be dropped and reimplemented on per-OS basis? I think that in the current state of affairs it's a reasonable move forwards.). OpenBSD does not ship any interface except argv[0] to get executable path. They have removed their procfs. NetBSD and FreeBSD deprecate procfs and fallback to /proc shall not be introduced into new code. > thanks > -- PMM >
signature.asc
Description: OpenPGP digital signature
