[Libguestfs] [PATCH nbdkit 3/9] server: Add general replacements for missing functions using LIBOBJS.
Richard W.M. Jones
rjones at redhat.com
Tue Aug 18 14:05:27 UTC 2020
On Tue, Aug 18, 2020 at 08:20:44AM -0500, Eric Blake wrote:
> On 8/18/20 5:50 AM, Richard W.M. Jones wrote:
> >Especially on Windows, some common functions are missing. Use the
> >autoconf LIBOBJS mechanism to replace these functions.
> >
> >This includes replacement functions for:
> >
> > Function names Implementation Origin
> >
> > getdelim, getline general purpose NetBSD under a compatible license
> >
> > openlog, syslog, Win32 written by me
> > vsyslog
> >
> > realpath Win32 written by me
> >
> > strndup general purpose written by me
> >
> >This should do nothing on existing supported platforms. It is only
> >intended in preparation for porting nbdkit to Windows.
> >---
>
> >@@ -464,6 +475,15 @@ AS_CASE([$host_os],
> > AC_MSG_RESULT([$is_windows])
> > AC_SUBST([NO_UNDEFINED_ON_WINDOWS])
> > AC_SUBST([LINK_LIBNBDKIT_ON_WINDOWS])
> >+AM_CONDITIONAL([IS_WINDOWS],[test "x$is_windows" = "xyes"])
> >+
> >+dnl For Windows, look for the mc/windmc utility.
> >+dnl XXX Do we need to check for mc.exe as well?
> >+AS_IF([test "x$is_windows" = "xyes"],[
> >+ AC_CHECK_TOOLS([MC],[windmc mc],[no])
> >+ AS_IF([test "x$MC" = "xno"],
> >+ [AC_MSG_ERROR([mc/windmc utility must be available when compiling for Windows])])
> >+])
>
> That's true for native windows, but not for cygwin. This one looks
> like our grouping of Cygwin as being 'is_windows' will bite us.
Yes - I think so (see below for more).
> >+++ b/common/replacements/Makefile.am
> >@@ -0,0 +1,53 @@
> >+# nbdkit
> >+# Copyright (C) 2019 Red Hat Inc.
>
> You can add 2020 if desired.
>
>
> >+++ b/common/replacements/win32/Makefile.am
> >@@ -0,0 +1,46 @@
> >+# nbdkit
> >+# Copyright (C) 2019 Red Hat Inc.
>
> and again
>
> >+# All rights reserved.
>
> Stale copy-and-paste; we got rid of these lines in 1.12.
This code was actually written in 2019, but yes I do need
to update this lot :-)
> >+EXTRA_DIST = nbdkit-cat.mc
> >+
> >+if IS_WINDOWS
> >+
> >+# Build the message catalog.
> >+noinst_DATA = MSG00001.bin nbdkit-cat.h nbdkit-cat.rc
> >+
> >+$(noinst_DATA): nbdkit-cat.mc
> >+ rm -f $@
> >+ $(MC) $<
>
> Is the message catalog integral to the general function
> replacements, or should this be split into a separate commit?
I honestly cannot remember now how all this worked, except that it was
apparently necessary for something - syslog support I think? I'll try
and investigate what it was used for.
> >+#include <config.h>
> >+
> >+#ifdef HAVE_REALPATH
> >+
> >+#include <limits.h>
> >+#include <stdlib.h>
>
> Why limits.h?
That's what realpath(3) says. However I think it might be a mistake
in the man page, or it could be because the man page refers to
PATH_MAX which is defined in <limits.h>. POSIX says only <stdlib.h>
is necessary.
> >diff --git a/common/replacements/syslog.h b/common/replacements/syslog.h
> >new file mode 100644
> >index 00000000..e4d76677
> >--- /dev/null
> >+++ b/common/replacements/syslog.h
>
> >+#include <config.h>
> >+
> >+#ifdef HAVE_SYSLOG_H
> >+
> >+#include_next <syslog.h>
>
> I guess our insistence on a decent compiler (for other reasons such
> as __attribute__((cleanup))) means we can rely on #include_next ;)
Huh, and I thought include_next was part of C ...
> >+++ b/common/replacements/openlog.c
>
> >+#ifdef WIN32
> >+
> >+/* Replacement openlog for Win32. */
> >+
> >+#include <windows.h>
> >+
> >+HANDLE event_source = INVALID_HANDLE_VALUE;
> >+
> >+void
> >+openlog (const char *ident, int option, int facility)
> >+{
> >+ event_source = RegisterEventSource (NULL, ident);
> >+}
>
> Ah, so if I understand, the message catalog compilation matters when
> replacing openlog? Cygwin has openlog, and thus does not need the
> replacement and thus not the message catalog.
I believe so, but I wrote this 18 months ago and can't remember the
details.
Re Cygwin: I wonder if we actually care about Cygwin at all. It's a
sufficiently different target that we would probably consider it to be
a new platform. But if anyone had even a partially working Windows
port using the native APIs would they want a Cygwin port? Maybe
the way to go is to remove |msys*|cygwin* from configure.ac.
> >+++ b/common/replacements/win32/nbdkit-cat.mc
> >@@ -0,0 +1,6 @@
> >+MessageId=1
> >+Severity=Error
> >+SymbolicName=NBDKIT_SYSLOG_ERROR
> >+Language=English
> >+%1
> >+.
>
> Does this file not allow for a copyright blurb? Or is it small
> enough to be trivial and not need one?
Apparently it does support a comment syntax. It's "unique":
https://docs.microsoft.com/en-us/windows/win32/eventlog/message-text-files
I'll take a look at all the other stuff you mentioned too, thanks.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top
More information about the Libguestfs
mailing list